打印字节序列

时间:2016-07-12 21:25:05

标签: c++ qt

我正在尝试使用下面的函数打印一个字节序列,但是我遇到了一些奇怪的东西,比如字符0xED,这应该是一个带有急性的拉丁文小写字母,打印为 (一个奇怪的里面有问号的字符,好像无法打印一样)。是由于我的代码,还是我打印出来的控制台?

此外,代码是否正确,或者您将采取哪些不同的方法来改进它?

编辑:输出示例

1F 8B 08 00 00 00 00 00  97 86 22 0D 89 72 EC 04    ........ .."..r�.

由于

void printBytes(std::string string) {
    QDebug qD = qDebug().nospace();
    qD << "Printing string of size " << string.size() << "\n";
    char buffer [3];
    int j = 0;
    std::string printable = "";
    for (uint32_t i = 0; i != string.size(); ++i) {
        snprintf(buffer, sizeof(buffer), "%02X", (unsigned char) string.at(i));
        qD << buffer;
        printable += QChar(string.at(i)).isPrint() ? string.at(i) : '.';
        printable += j == 7 ? " "  : "";
        if (j == 15) {
            qD << "\t" << printable.c_str() << "\n";
            printable = "";
            j = 0;
        } else {
            qD << (j == 7 ? "  " : " ");
            j++;
        }
    }
    if (j != 0) {
        qD << std::string((16-j) * 3, ' ').c_str() << "\t" << printable.c_str();
    }
}

1 个答案:

答案 0 :(得分:2)

特定八位字节(一个字节)是否显示特定字符​​完全取决于您的系统环境的区域设置。

Octet 0xED确实是ISO-8859-1(或许是ISO-8859-15)语言环境中的字符。但是,例如,如果您的系统环境的语言环境是UTF-8(通常是所有现代操作系统的情况),则字符í将由多字节序列0xC3 0xAD显示。

最可能的答案是您的操作系统(您未指定)不使用ISO-8859-n语言环境,但可能是UTF-8(或其他一些编码)。要么重新配置系统环境,要么为程序的输出使用UTF-8(或正确的编码)。