2016-02-18 2 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

Возможно, вы это и нашли? Код будет анализировать произвольную длину шестнадцатеричной строки и возвращать массив из двухзначных шестнадцатеричных чисел вместе с их счетчиком. Он выделяет память для результата, поэтому вы несете ответственность за ее выпуск. Количество извлеченных чисел возвращается через третий аргумент.

#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 для преобразования шестигранной строки в целом (или 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