2016-02-18 97 views
1

我有一个的QString:字符串为十六进制分裂

QString str = "1000140035"; 

我想从上面这样的字符串中提取每个字节: -

Unsigned char a = 0x10 
Unsigned char b = 0x00 
Unsigned char c = 0x14 
Unsigned char d = 0x00 
Unsigned char e = 0x35 

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

+6

它总是更好地展示一个尝试(http://stackoverflow.com/help/how-to-ask) – bibi

回答

3

QByteArray::fromHex + QString::toLatin1()

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]; 
1

也许这是你在找什么?该代码将解析任意长度的十六进制字符串并返回一个2位十六进制数字及其数量的数组。它为结果分配内存,所以你有责任在之后释放它。提取的数字的数量通过第三个参数返回。

#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()); 
    } 
} 
+0

其工作...! – Katoch

+1

您正在修改本地'result'参数,因此您应该将其作为对指针的引用或作为指针的指针传递。在你的情况下,变量'result'不会被改变。这是一个内存泄漏+逻辑错误,因为'ExtractBytes'方法的结果将不可用。 –

+0

@SaZ好的一点,我的不好,结果现在通过作为目标指针的参考 – Nazara

1

您可以使用QString::toInt和基础设置为16至十六进制字符串转换为int(或QString::toUInt)。

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); 
} 
+0

会试试这个..! – Katoch

+0

不要。 Thuga很酷,但它是一个手工编写的代码,开销很大(非常规的字符串修改)。在Qt中有这种东西的现有方法.... –

+3

@Katoch我会与SaZ的解决方案。它将所有字节存储在'QByteArray'中,因此您不必手动执行。 – thuga

相关问题