2016-05-09 4 views
0

Я читал много предложений по одной теме и пытался реализовать многие из них, но, похоже, что никто из них не работает в моей среде. Я использую QT 5, но я думаю, что проблема не связана с QT, а с тем, как шестнадцатеричный символ 0x00 интерпретируется языком. Что я должен добиться того, чтобы отобразить поток неподписанные символ в виде шестнадцатеричных значений, например:создать и отобразить шестнадцатеричную строку в C++

Входные байты: 0x00 0x4e 0x01 0x00 0x17 0x00

Показать как: 0х00: 0x4e: 0x01: 0x00: 0x17: 0x00

кажется довольно легко, но все это я получаю пустой строкой ...

функции я писал:

QString getBufferAsHexStr(const unsigned char* buf, int buffsize) { 
std::string finalstring(""); 
char tempbuff[5]; 
int n=0, index=0; 
for (int c = 0; c < buffsize; c++) { 
    if(c == buffsize-1) { 
     n=sprintf(tempbuff, "0x%02X", buf[c]); 
    } else { 
     n=sprintf(tempbuff, "0x%02X:", buf[c]); 
    } 
    finalstring.append(tempbuff, n); 
    index += n; 
} 
QString resultStr(finalstring.c_str()); 
return resultStr; 
} 

QString getBufferAsHexStr(const unsigned char* buf, int buffsize) { 
std::stringstream ss; 
for (int c = 0; c < buffsize; c++) { 
    if(c == buffsize-1) { 
     ss << std::hex << std::showbase << buf[c]; 
    } else { 
     ss << std::hex << std::showbase << buf[c] << ":"; 
    } 
} 
const std::string finalstring = ss.str(); 
QString resultStr(finalstring.c_str()); 
return resultStr; 
} 
+0

FIRST, почему вы делаете 'tempbuff' в вашем первом примере, чтобы размер был равен тому, что вы думаете * он должен быть? Вы идете по канату, сделав этот размер '5'. Почему бы не сделать это 10 и быть в безопасности? На самом деле это переполнение буфера, поскольку вы пытаетесь набить в него 6 символов. – PaulMcKenzie

+0

@drescherjm: Из любопытства, почему QString, а не 'std :: string'? –

+0

Это второй вариант. – drescherjm

ответ

4

Я не знаю, почему вы начали использовать функции C++ с типами C++, когда у вас есть намного лучшая альтернатива, которая равна QString. Использование QString можно реализовать следующим образом:

QString getBufferAsHexStr(const unsigned char* buf, int buffsize) { 
    QString result; 
    for(int i = 0; i < buffsize; ++i) 
     result += "0x" + QString("%1:").arg(buf[i], 2, 16, QChar('0')).toUpper(); 
    result.chop(1); 
    return result; 
} 
+0

Привет ixSci, ваше решение работает очень хорошо, оно просто не показывает ведущее 0, когда это так, но я могу обойти его. Чтобы ответить на ваш вопрос: я не очень хорошо знаю QT, я все еще учусь правильно его использовать :) – Bruno

+0

@Bruno, обновил ответ. Теперь он обрабатывает случай с 0. Кроме того, если ответ вам поможет, нажмите на отметку рядом с ответом. – ixSci

+0

Большое вам спасибо, это простой вопрос, но мне очень помогли. Очень признателен – Bruno

0

другой вариант с использованием QByteArray и присоединился QStringList:

QString getBufferAsHexStr(QByteArray buf) { 
    QStringList byteStrings; 
    for (int i = 0; i < buf.size(); ++i) 
     byteStrings += QString("0x") + QString("%1").arg(buf[i], 2, 16, QChar('0')).toUpper(); 
    return byteStrings.join(":"); 
} 

Было бы вызываемым с помощью

QString result = getBufferAsHexStr(QByteArray(charArr, charArrSize));

Смежные вопросы