簡體   English   中英

在c ++中快速將原始數據轉換為十六進制字符串

[英]Quickly convert raw data to hex string in c++

我正在從文件中讀取數據並嘗試將原始數據顯示為2位十六進制字符串。

我正在使用Qt框架,特別是QTextEdit。

我嘗試了很多不同的方法,幾乎​​完成了我想要它做的事情,但它有一些我不知道的意外錯誤。

目前這是我的實施:

1)讀入數據:

ifstream file (filePath, ios::in|ios::binary|ios::ate);
if (file.is_open())
{
    size = file.tellg();
    memblock = new char [size+1];
    file.seekg(0, ios::beg);
    file.read(memblock, size);
    file.close();
}

2)創建一個將使用的QString(因為QTextEdit需要一個QString):

QString s;

3)循環遍歷數組,將每個連續的字符附加到QString。

int count = 0;
for(i=0;i<size;i++)
{
    count++;;
    s.append(QString::number(memblock[i], 16).toUpper());
    s.append("\t");
    if (count == 16)
    {
        s.append("\n");
        count -= 16;
    }
}

現在這個工作正常,除非它到達字符FF ,它顯示為FFFFFFFFFFFFFFFF

所以我的主要問題是:

  1. 為什么只有'FF'字符顯示為'FFFFFFFFFFFFFFFF'?
  2. 有沒有辦法將char數據轉換為基本16字符串而不使用QString :: number?

我希望這個實現盡可能快,所以如果像sprintf這樣的東西可以工作,請告訴我,因為我猜想QString :: number可能會更快。

QString不能用於二進制數據。 你應該使用QByteArray 它可以很容易地從char* buffer創建,並且可以使用toHex輕松轉換為十六進制字符串。

QByteArray array(memblock, size);
textEdit->setText(QString(array.toHex()));

QString::number沒有帶char的重載,所以你的輸入被提升為int ; 因此你看到了符號擴展的影響。 您應該看到任何大於0x7F輸入0x7F類似的行為。

在調用函數之前嘗試轉換數據。

s.append(QString::number(static_cast<unsigned char>(memblock[i]), 16).toUpper());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM