PHP把 ASCII 字符的字符串转换为十六进制值

本文介绍PHP中如何使用bin2hex函数将ASCII字符串转换为十六进制值,并通过pack函数实现逆向转换,展示了两个函数的具体用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

bin2hex(string) 这个函数可以把 ASCII 字符的字符串转换为十六进制值,我们就经常用在加密和解密上。代码如下

<?php
$str = "ABCDEFG";
echo bin2hex($str); // 转16进制
echo pack("H*",bin2hex($str)); // 用pack函数可以恢复字符串
?>


<think>我们之前已经讨论了如何将ASCII字符串转换十六进制字符串。现在,用户的问题是:如何在Qt中将十六进制字符串转换ASCII字符串。 根据用户的问题,我们需要实现将十六进制字符串(例如:"48656c6c6f20517421")转换回原始的ASCII字符串(例如:"Hello Qt!")。 在Qt中,我们可以使用`QByteArray::fromHex()`静态方法来实现这个转换。这个方法接受一个十六进制格式的字符串(每个字节由两个十六进制字符表示)并返回对应的QByteArray。然后,我们可以将QByteArray转换为QString(使用Latin1编码,因为原始数据是ASCII)。 步骤: 1. 将十六进制字符串(QString转换为QByteArray。注意,`QByteArray::fromHex()`需要输入一个包含十六进制字符的QByteArray,所以我们需要先将QString转换为QByteArray(使用toLatin1()或toUtf8(),但这里十六进制字符串本身是ASCII字符,所以两种方法都可以)。 2. 使用`QByteArray::fromHex()`将十六进制表示的字节数组转换为原始字节数组。 3. 将原始字节数组(QByteArray)解释为ASCII字符串,使用`QString::fromLatin1()`将其转换为QString。 注意:如果原始数据是纯ASCII,则使用Latin1编码是合适的。如果原始数据包含非ASCII字符(如UTF-8编码的中文),则应该使用`QString::fromUtf8()`。 示例代码: ```cpp QString hexToAscii(const QString& hexStr) { // 将十六进制字符串(QString转换为QByteArray(十六进制字符本身是ASCII,所以用toLatin1) QByteArray hexData = hexStr.toLatin1(); // 将十六进制QByteArray转换为原始字节数组 QByteArray byteArray = QByteArray::fromHex(hexData); // 将原始字节数组解释为ASCII字符串(使用Latin1编码) return QString::fromLatin1(byteArray); } ``` 如果原始数据是UTF-8编码(比如包含中文),则最后一步应改为: ```cpp return QString::fromUtf8(byteArray); ``` 使用示例: ```cpp QString hexString = "48656c6c6f20517421"; // 对应"Hello Qt!" QString asciiString = hexToAscii(hexString); qDebug() << asciiString; // 输出: "Hello Qt!" ``` 注意事项: 1. 输入十六进制字符串必须是有效的,即长度为偶数(因为每个字节由两个十六进制字符表示),且只包含0-9, a-f, A-F。如果字符串无效,`fromHex()`会忽略无效字符,如果长度是奇数,最后一个字符可能会被忽略(具体行为可查看文档)。 2. 如果原始数据不是ASCII,而是其他编码(如UTF-8),则最后一步要使用对应的编码转换函数。 另外,如果十六进制字符串中有空格或其他分隔符,我们需要先移除这些非十六进制字符,然后再进行转换。例如: ```cpp // 移除所有非十六进制字符(只保留0-9, a-f, A-F) QString cleanHex = hexStr; cleanHex.remove(QRegularExpression("[^0-9a-fA-F]")); ``` 完整示例(包含清理非十六进制字符): ```cpp QString hexToAscii(const QString& hexStr) { // 清理输入,移除非十六进制字符 QString cleanHex = hexStr; cleanHex.remove(QRegularExpression("[^0-9a-fA-F]")); // 检查长度是否为偶数,如果不是,可以去掉最后一个字符(根据需求) if (cleanHex.length() % 2 != 0) { cleanHex.chop(1); // 移除最后一个字符 } QByteArray hexData = cleanHex.toLatin1(); QByteArray byteArray = QByteArray::fromHex(hexData); return QString::fromLatin1(byteArray); } ``` 但是,请注意,如果原始十六进制字符串是故意包含非十六进制字符(如空格分隔符)的,我们可能需要保留这些分隔符的位置信息?但通常转换前会先清理掉。 最后,根据用户提供的引用,我们注意到关于编码转换的一些弃用信息(引用[1]),但我们的方法使用的是Qt的API,不涉及C++标准库中弃用的编码转换工具,所以是安全的。 引用[2]提到了函数风格的类型转换,但我们的代码中并没有使用这种转换,所以可以忽略。 引用[3]是关于CMake的`separate_arguments`命令,与当前问题无关。 引用[4]是关于PHP反序列化的,与当前问题无关。 因此,我们专注于使用Qt的API实现十六进制字符串ASCII字符串转换。 相关问题: 1. 如何将十六进制字符串转换为原始字节数组(QByteArray)? 2. 如何处理包含非十六进制字符(如空格)的输入字符串? 3. 如果原始数据是UTF-8编码,如何正确转换?</think>### Qt中将十六进制字符串转回ASCII字符串 在Qt中将十六进制字符串转换ASCII字符串,可以使用`QByteArray::fromHex()`方法,这是最推荐的方式: ```cpp QString hexToAscii(const QString& hexStr) { // 1. 将十六进制字符串转换为QByteArray QByteArray hexData = hexStr.toLatin1(); // 2. 使用fromHex()转换回原始字节 QByteArray byteArray = QByteArray::fromHex(hexData); // 3. 将字节数组转换ASCII字符串 return QString::fromLatin1(byteArray); } // 使用示例 QString hexStr = "48656c6c6f20517421"; // "Hello Qt!"的十六进制表示 QString asciiStr = hexToAscii(hexStr); // 结果: "Hello Qt!" ``` #### 关键步骤说明: 1. **输入处理**: - 十六进制字符串中的字母不区分大小写("4865" 和 "4865" 等效) - 会自动忽略空格等非十六进制字符 ```cpp // 含空格的输入也能正确处理 QString hexWithSpaces = "48 65 6c 6c 6f"; QString result = hexToAscii(hexWithSpaces); // "Hello" ``` 2. **错误处理**: - 如果字符串长度不是偶数(每个字节需要2个十六进制字符),最后一个字符会被忽略 - 包含无效字符时会自动跳过 ```cpp // 添加错误检查 if (hexStr.length() % 2 != 0) { qWarning() << "无效的十六进制字符串长度"; return ""; } ``` 3. **UTF-8支持**: 如果原始数据包含非ASCII字符(如中文),需使用UTF-8编码: ```cpp QString hexToUtf8(const QString& hexStr) { QByteArray hexData = hexStr.toLatin1(); QByteArray byteArray = QByteArray::fromHex(hexData); return QString::fromUtf8(byteArray); // 关键变化 } ``` #### 完整示例: ```cpp #include <QDebug> int main() { // 纯ASCII转换 QString hexAscii = "517420697320677265617421"; // "Qt is great!" qDebug() << "ASCII转换:" << hexToAscii(hexAscii); // 中文转换(UTF-8) QString hexChinese = "e4b8ade69687"; // "中文"的UTF-8编码 qDebug() << "中文转换:" << hexToUtf8(hexChinese); // 带空格的输入 QString hexWithSpace = "54 65 73 74 20 44 61 74 61"; qDebug() << "带空格输入:" << hexToAscii(hexWithSpace); // "Test Data" return 0; } ``` #### 注意事项: 1. **编码一致性**: - 原始数据是纯ASCII → 使用`fromLatin1()` - 原始数据含非ASCII字符 → 使用`fromUtf8()` - 错误编码会导致乱码(如UTF-8数据用Latin1解码) 2. **性能优化**: - 对于长字符串,避免多次拼接操作 - 使用`reserve()`预分配内存: ```cpp hexData.reserve(hexStr.length()); ``` 3. **二进制数据处理**: 此方法同样适用于二进制数据转换: ```cpp QByteArray binaryData = QByteArray::fromHex("001122FF"); ``` > 关于编码转换的说明:虽然C++17弃用了`std::codecvt`(引用[1]),但Qt的编码转换API是独立且稳定的,可安全使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ganshenmail

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值