Qt 字符串到十六进制拆分

Qt 字符串到十六进制拆分,qt,qstring,Qt,Qstring,我有一个Q字符串: QString str = "1000140035"; 我想从上面的字符串中提取每个字节,如下所示:-- 请建议如何做到这一点。。。尝试了很多次,但都失败了。也许这就是你想要的?该代码将解析任意长度的十六进制字符串,并返回一个包含两位十六进制数及其计数的数组。它为结果分配内存,因此您有责任在之后释放它。提取的数字数通过第三个参数返回 #include <QString> #include <cmath> unsigned HexToNum(char

我有一个Q字符串:

QString str = "1000140035";
我想从上面的字符串中提取每个字节,如下所示:--


请建议如何做到这一点。。。尝试了很多次,但都失败了。

也许这就是你想要的?该代码将解析任意长度的十六进制字符串,并返回一个包含两位十六进制数及其计数的数组。它为结果分配内存,因此您有责任在之后释放它。提取的数字数通过第三个参数返回

#include <QString>
#include <cmath>

unsigned HexToNum(char c)
{
    if(c >= '0' && c <= '9')
        return c - '0';

    if(c >= 'A' && c <= 'F')
        return 15 + c - 'A';

    if(c >= 'a' && c <= 'f')
        return 15 + c - 'a';

    //Non hex char passed, return 0
    return 0;
}

void ExtractBytes(const QString& hexString, unsigned char*& result, int& resultNumbersCount)
{
    resultNumbersCount = static_cast<int>(ceil(hexString.length() / 2));
    result = new unsigned char[resultNumbersCount];

    int i, j = -1;
    for(i = 0; i < resultNumbersCount; ++i)
        result[i] = 0;

    for(i = 0; i < hexString.length(); ++i)
    {
        if(i % 2 == 0)
            ++j;

        result[j] = result[j] * 16 + HexToNum(hexString.at(i).toLatin1());
    }
}
#包括
#包括
无符号十六进制数(字符c)
{

如果(c>='0'&&c='A'&&c='A'&&c也许这就是您要寻找的?代码将解析任意长度的十六进制字符串,并返回一个由两位十六进制数字组成的数组及其计数。它为结果分配内存,因此您有责任随后释放它。将返回提取的数字数通过第三个论点

#include <QString>
#include <cmath>

unsigned HexToNum(char c)
{
    if(c >= '0' && c <= '9')
        return c - '0';

    if(c >= 'A' && c <= 'F')
        return 15 + c - 'A';

    if(c >= 'a' && c <= 'f')
        return 15 + c - 'a';

    //Non hex char passed, return 0
    return 0;
}

void ExtractBytes(const QString& hexString, unsigned char*& result, int& resultNumbersCount)
{
    resultNumbersCount = static_cast<int>(ceil(hexString.length() / 2));
    result = new unsigned char[resultNumbersCount];

    int i, j = -1;
    for(i = 0; i < resultNumbersCount; ++i)
        result[i] = 0;

    for(i = 0; i < hexString.length(); ++i)
    {
        if(i % 2 == 0)
            ++j;

        result[j] = result[j] * 16 + HexToNum(hexString.at(i).toLatin1());
    }
}
#包括
#包括
无符号十六进制数(字符c)
{
如果(c>='0'&&c='A'&&c='A'&&c,您可以使用并将基数设置为16来将十六进制字符串转换为int(或)

可以使用并将基数设置为16,将十六进制字符串转换为int(或)

+

+


显示尝试()总是更好。显示尝试()总是更好。Thuga很酷,但它是一个手工编写的代码,开销很大(不必要的字符串修改)。Qt中已有用于这些事情的方法…@Katoch我同意SaZ的解决方案。它将所有字节存储在
QByteArray
中,因此您不必手动执行。Thuga很酷,但它是一个手工编写的代码,开销很大(不必要的字符串修改)。Qt中有一些现有的方法可以解决这些问题。…@Katoch我同意SaZ的解决方案。它将所有字节存储在
QByteArray
中,因此您不必手动执行。您正在修改一个本地
result
参数,因此应该将其作为指针的引用或指针传递。在您的情况下,变量
result
不会更改。这是一个内存泄漏+逻辑错误,因为
ExtractBytes
方法的结果将不可用。@SaZ Good point,my bad,result现在作为对目标点的引用传递。当然,你有很多手工制作的魔法,可以用Qt完成。检查我的答案;)您正在修改一个本地
result
参数,因此应该将其作为指向指针的引用或指向指针的指针传递。在您的情况下,变量
result
将不会更改。这是内存泄漏+逻辑错误,因为
ExtractBytes
方法的结果将不可用。@SaZ Good point,my bad,result现在是passed作为对目标点的参考。总之,你有很多手工制作的魔法,这可以用Qt来完成。检查我的答案;)
QString str = "1000140035";
while(!str.isEmpty())
{
    unsigned char byte = str.left(2).toInt(0, 16);
    // do something with byte, store it somewhere or whatever...
    str.remove(0, 2);
}
const QString str = "1000140035";
const QByteArray data = QByteArray::fromHex( str.toLatin1() );
unsigned char a = data[0];
unsigned char b = data[1];
unsigned char c = data[2];
unsigned char d = data[3];
unsigned char e = data[4];