【问题标题】:Writing hexadecimal values to text file, showing up as binary [duplicate]将十六进制值写入文本文件,显示为二进制 [重复]
【发布时间】:2020-06-19 19:41:29
【问题描述】:

我有一个简单的程序,我正在尝试将字节模式的十六进制值序列写入以下格式的文本文件:

任意数据表示

3f 42 5c b8 d9 0a // etc...

这是我的程序。

int main() {
    char digits[] = { 0x7e, 0x30, 0x6d, 0x79, 0x33, 0x5b, 0x5f, 0x70, 0x7f, 0x7b };

    std::fstream file;
    file.open("display.txt", std::ios::out);

    // Ones place
    for (int val = 0; val <= 255; val += 1)
        file << std::hex << digits[val % 10] << " ";
    file << std::endl;

    // Tens place
    for (int val = 0; val <= 255; val += 1)
        file << std::hex << digits[(val / 10) % 10] << " ";
    file << std::endl;

    // Hundreds place
    for (int val = 0; val <= 255; val += 1)
        file << std::hex << digits[(val / 100) % 10] << " ";
    file << std::endl;

    // Sign digit
    for (int val = 0; val <= 255; val += 1)
        file << std::hex << 0 << " ";
    file << std::endl;

    // Ones Place Twos Complement
    for (int val = -128; val <= 127; val += 1)
        file << std::hex << digits[abs(val) % 10] << " ";
    file << std::endl;

    // Tens Place Twos Complement
    for (int val = -128; val <= 127; val += 1)
        file << std::hex << digits[abs(val / 10) % 10] << " ";
    file << std::endl;

    // Hundreds Place Twos Complement
    for (int val = -128; val <= 127; val += 1)
        file << std::hex << digits[abs(val / 100) % 10] << " ";
    file << std::endl;

    // Sign Digit Twos Complement
    for (int val = -128; val <= 127; val += 1) {
        if (val < 0)
            file << std::hex << 01;
        else {
            file << std::hex << 00;
        }
        file << " ";
    }
    file << std::endl;

    file.close();

    return 0;
}

但是,在我运行程序并打开我的文本文件后,它显示为好像它是二进制文件...我不确定我做错了什么、遗漏了什么或忽略了什么。

这是我的文本文件的样子:

⁾‰⁹″⁛ ⁰ⁿ⁻⁾‰⁹″⁛ ⁰ⁿ⁻⁾‰⁹″⁛ ⁰ⁿ⁻⁾‰⁹″⁛ ⁰ⁿ⁻⁾‰⁹″⁛ ⁰ⁿ⁻⁾‰⁹″⁛ ⁰ⁿ⁻⁾‰⁹″⁛ ⁰ⁿ⁻⁾‰⁹″⁛ ⁰ⁿ⁻⁾‰⁹″⁛ ⁰ⁿ⁻⁾‰⁹″⁛ ⁰ⁿ⁻⁾‰⁹″⁛ ⁰ⁿ⁻⁾‰⁹″⁛ ⁰ⁿ⁻⁾‰⁹″⁛ ⁰ⁿ⁻⁾‰⁹″⁛ ⁰ⁿ⁻⁾‰⁹″⁛ ⁰ⁿ⁻⁾‰⁹″⁛ ⁰ⁿ⁻⁾‰⁹″⁛ ⁰ⁿ⁻⁾‰⁹″⁛ ⁰ⁿ⁻⁾‰⁹″⁛ ⁰ⁿ⁻⁾‰⁹″⁛ ⁰ⁿ⁻⁾‰⁹″⁛ ⁰ⁿ⁻⁾‰⁹″⁛ ⁰ⁿ⁻⁾‰⁹″⁛ ⁰ⁿ⁻⁾‰⁹″⁛ ⁰ⁿ⁻⁾‰⁹″⁛ ⁰ⁿ⁻⁾‰⁹″⁛਍⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾‰‰‰‰‰‰‰‰‰‰⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹″″″″″″″″″″⁛⁛⁛⁛⁛⁛⁛⁛⁛⁛          ⁰⁰⁰⁰⁰⁰⁰⁰⁰⁰ⁿⁿⁿⁿⁿⁿⁿⁿⁿⁿ⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾‰‰‰‰‰‰‰‰‰‰⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹″″″″″″″″″″⁛⁛⁛⁛⁛⁛⁛⁛⁛⁛          ⁰⁰⁰⁰⁰⁰⁰⁰⁰⁰ⁿⁿⁿⁿⁿⁿⁿⁿⁿⁿ⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾‰‰‰‰‰‰‰‰‰‰⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹″″″″″″″″″″⁛⁛⁛⁛⁛⁛਍⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰਍‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰਍ⁿ⁰ ⁛″⁹‰⁾⁻ⁿ⁰ ⁛″⁹‰⁾⁻ⁿ⁰ ⁛″⁹‰⁾⁻ⁿ⁰ ⁛″⁹‰⁾⁻ⁿ⁰ ⁛″⁹‰⁾⁻ⁿ⁰ ⁛″⁹‰⁾⁻ⁿ⁰ ⁛″⁹‰⁾⁻ⁿ⁰ ⁛″⁹‰⁾⁻ⁿ⁰ ⁛″⁹‰⁾⁻ⁿ⁰ ⁛″⁹‰⁾⁻ⁿ⁰ ⁛″⁹‰⁾⁻ⁿ⁰ ⁛″⁹‰⁾⁻ⁿ⁰ ⁛″⁹‰⁾‰⁹″⁛ ⁰ⁿ⁻⁾‰⁹″⁛ ⁰ⁿ⁻⁾‰⁹″⁛ ⁰ⁿ⁻⁾‰⁹″⁛ ⁰ⁿ⁻⁾‰⁹″⁛ ⁰ⁿ⁻⁾‰⁹″⁛ ⁰ⁿ⁻⁾‰⁹″⁛ ⁰ⁿ⁻⁾‰⁹″⁛ ⁰ⁿ⁻⁾‰⁹″⁛ ⁰ⁿ⁻⁾‰⁹″⁛ ⁰ⁿ⁻⁾‰⁹″⁛ ⁰ⁿ⁻⁾‰⁹″⁛ ⁰ⁿ⁻⁾‰⁹″⁛ ⁰਍‰‰‰‰‰‰‰‰‰‰⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻ⁿⁿⁿⁿⁿⁿⁿⁿⁿⁿ⁰⁰⁰⁰⁰⁰⁰⁰⁰⁰          ⁛⁛⁛⁛⁛⁛⁛⁛⁛⁛″″″″″″″″″″⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹‰‰‰‰‰‰‰‰‰‰⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾‰‰‰‰‰‰‰‰‰‰⁹⁹⁹⁹⁹⁹⁹⁹⁹⁹″″″″″″″″″″⁛⁛⁛⁛⁛⁛⁛⁛⁛⁛          ⁰⁰⁰⁰⁰⁰⁰⁰⁰⁰ⁿⁿⁿⁿⁿⁿⁿⁿⁿⁿ⁻⁻⁻⁻⁻⁻⁻⁻⁻⁻⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾‰‰‰‰‰‰‰‰‰‰਍‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾⁾‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰਍‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‱‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰਍

它甚至没有从std::endl 打印新行。

编辑

我一直在做一些测试;我怀疑它与数组的类型结合std::hex...

我在使用 charunsigned charstd::uint8_tstd::int8_t 时得到这个二进制转储,但是,如果我使用 shortintunsigned intstd::uint16_tstd::int16_t 它似乎正在打印出十六进制值...

当使用不是char 类型的integral 类型时...我得到这个输出:

7e 30 6d 79 33 5b 5f 70 7f 7b 7e 30 6d 79 33 5b 5f 70 7f 7b 7e 30 6d 79 33 5b 5f 70 7f 7b 7e 30 6d 79 33 5b 5f 70 7f 7b 7e 30 6d 79 33 5b 5f 70 7f 7b 7e 30 6d 79 33 5b 5f 70 7f 7b 7e 30 6d 79 33 5b 5f 70 7f 7b 7e 30 6d 79 33 5b 5f 70 7f 7b 7e 30 6d 79 33 5b 5f 70 7f 7b 7e 30 6d 79 33 5b 5f 70 7f 7b 7e 30 6d 79 33 5b 5f 70 7f 7b 7e 30 6d 79 33 5b 5f 70 7f 7b 7e 30 6d 79 33 5b 5f 70 7f 7b 7e 30 6d 79 33 5b 5f 70 7f 7b 7e 30 6d 79 33 5b 5f 70 7f 7b 7e 30 6d 79 33 5b 5f 70 7f 7b 7e 30 6d 79 33 5b 5f 70 7f 7b 7e 30 6d 79 33 5b 5f 70 7f 7b 7e 30 6d 79 33 5b 5f 70 7f 7b 7e 30 6d 79 33 5b 5f 70 7f 7b 7e 30 6d 79 33 5b 5f 70 7f 7b 7e 30 6d 79 33 5b 5f 70 7f 7b 7e 30 6d 79 33 5b 5f 70 7f 7b 7e 30 6d 79 33 5b 5f 70 7f 7b 7e 30 6d 79 33 5b 5f 70 7f 7b 7e 30 6d 79 33 5b 
7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 30 30 30 30 30 30 30 30 30 30 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 79 79 79 79 79 79 79 79 79 79 33 33 33 33 33 33 33 33 33 33 5b 5b 5b 5b 5b 5b 5b 5b 5b 5b 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 70 70 70 70 70 70 70 70 70 70 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7b 7b 7b 7b 7b 7b 7b 7b 7b 7b 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 30 30 30 30 30 30 30 30 30 30 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 79 79 79 79 79 79 79 79 79 79 33 33 33 33 33 33 33 33 33 33 5b 5b 5b 5b 5b 5b 5b 5b 5b 5b 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 70 70 70 70 70 70 70 70 70 70 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7b 7b 7b 7b 7b 7b 7b 7b 7b 7b 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 30 30 30 30 30 30 30 30 30 30 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 79 79 79 79 79 79 79 79 79 79 33 33 33 33 33 33 33 33 33 33 5b 5b 5b 5b 5b 5b 
7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
7f 70 5f 5b 33 79 6d 30 7e 7b 7f 70 5f 5b 33 79 6d 30 7e 7b 7f 70 5f 5b 33 79 6d 30 7e 7b 7f 70 5f 5b 33 79 6d 30 7e 7b 7f 70 5f 5b 33 79 6d 30 7e 7b 7f 70 5f 5b 33 79 6d 30 7e 7b 7f 70 5f 5b 33 79 6d 30 7e 7b 7f 70 5f 5b 33 79 6d 30 7e 7b 7f 70 5f 5b 33 79 6d 30 7e 7b 7f 70 5f 5b 33 79 6d 30 7e 7b 7f 70 5f 5b 33 79 6d 30 7e 7b 7f 70 5f 5b 33 79 6d 30 7e 7b 7f 70 5f 5b 33 79 6d 30 7e 30 6d 79 33 5b 5f 70 7f 7b 7e 30 6d 79 33 5b 5f 70 7f 7b 7e 30 6d 79 33 5b 5f 70 7f 7b 7e 30 6d 79 33 5b 5f 70 7f 7b 7e 30 6d 79 33 5b 5f 70 7f 7b 7e 30 6d 79 33 5b 5f 70 7f 7b 7e 30 6d 79 33 5b 5f 70 7f 7b 7e 30 6d 79 33 5b 5f 70 7f 7b 7e 30 6d 79 33 5b 5f 70 7f 7b 7e 30 6d 79 33 5b 5f 70 7f 7b 7e 30 6d 79 33 5b 5f 70 7f 7b 7e 30 6d 79 33 5b 5f 70 7f 7b 7e 30 6d 79 33 5b 5f 70 
6d 6d 6d 6d 6d 6d 6d 6d 6d 30 30 30 30 30 30 30 30 30 30 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7b 7b 7b 7b 7b 7b 7b 7b 7b 7b 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 70 70 70 70 70 70 70 70 70 70 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5b 5b 5b 5b 5b 5b 5b 5b 5b 5b 33 33 33 33 33 33 33 33 33 33 79 79 79 79 79 79 79 79 79 79 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 30 30 30 30 30 30 30 30 30 30 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 30 30 30 30 30 30 30 30 30 30 6d 6d 6d 6d 6d 6d 6d 6d 6d 6d 79 79 79 79 79 79 79 79 79 79 33 33 33 33 33 33 33 33 33 33 5b 5b 5b 5b 5b 5b 5b 5b 5b 5b 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 70 70 70 70 70 70 70 70 70 70 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7b 7b 7b 7b 7b 7b 7b 7b 7b 7b 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 30 30 30 30 30 30 30 30 30 30 6d 6d 6d 6d 6d 6d 6d 6d 
30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 7e 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

我认为这可能会解决我自己的问题,但我仍然想知道为什么我会得到使用 char 类型和 std::hex 的输出...

【问题讨论】:

  • “字符和字符串参数(例如,char 或 const char* 类型)由 operatoren.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt
  • en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt2 "在构造并检查哨兵对象后,插入字符 ch。"所以在charunsigned char 上调用&lt;&lt; 只会将char 输出到流中。根本不咨询basefieldstd::hex 修改)。
  • 如果您想为charunsigned char 类型使用类似整数的ostream&amp; &lt;&lt; 重载,则需要将其称为file.operator&lt;&lt;('c')
  • @John 这似乎是有道理的。有时,您会忘记或忽略一些简单的事情。我在这个简单的东西上摇了将近半个小时......然后我突然想到尝试不同类型的相同程序......
  • 我还在摸不着头脑,为什么你会在输出中得到那些非 ascii 字符。 0x7e 是~。第一个字符应该是~

标签: c++ hex text-files fstream


【解决方案1】:

这是记事本中的错误。

问题的核心是您的文本文件被记事本误解为 UTF-16 而不是 ascii。

记事本有一种算法,可以尝试推断文件使用的编码类型。它调用的实际 Windows API 称为 IsTextUnicode。该 API 基本上检查字节排序标记 (BOM) 标头。在没有 BOM 的情况下,它会读取前几百字节的文本,并进行一些推理和启发式方法来检测文件是 ascii、utf-8 还是 unicode。它本质上是在猜测。

在您的情况下,文件的第一个字节是0x7E~。如果我在十六进制编辑器中将其删除并保存回来,记事本会显示正确的文件编码,如下所示。

关于高位 ascii 字符的初始字节序列的某些东西会导致算法失效。

因此,正确的解决方法是将字节顺序标记插入到您的文本流中,这样记事本就不会尝试根据启发式推断编码。

file.open("display.txt", std::ios::out);

const char* utf7_bom = "+/v8";
file << utf7_bom;

这个 4 字节的小序列告诉文本解码器,大多数编辑器都能识别,“这个文件是 ascii”。您可以在此处阅读有关 BOM 令牌的更多信息:https://en.wikipedia.org/wiki/Byte_order_mark

【讨论】:

  • 没想过先将其传递给字符串流,然后将其推送到文件流中进行写入...这比使用explicit cast的评论建议要好...对于我的一般目的它可以是一个 int 64 哈哈...我所关心的只是在文本文件中获取正确的十六进制值!
  • 实际上,我完全修改了我的答案以表明这是记事本中的错误,而不是您的代码本身。你仍然可以使用 stringstream 技巧,但我怀疑它会产生同样的问题。
  • 也许吧,但我仍然认为整体问题与 C++ 如何处理带有输出流的 char 类型有关。例如,如果我有:char c = 'a'; std::cout &lt;&lt; c; 它会在控制台或文本文件中打印出a...现在如果你想要a 的整数版本,你所要做的就是使用整数提升。 std::cout &lt;&lt; +c; 你就完成了!现在您将获得字符编码类型的实际整数值,可以是 ascii、utf-8 等...
  • 事实上,我认为它与stream 类型(例如iostreamfstream)没有任何直接关系。我认为这是处理流对象的&lt;&lt;()&gt;&gt;() 操作符内部工作的一部分。
  • 但是,您对字节顺序标记的建议以及文本编辑器在打开文件时如何在文件头中查找它们的建议非常有用,并且是一条需要注意的好信息!
【解决方案2】:

我完全忘记了用于基本char 类型的整数提升的+ 运算符。在我看来,最简单、最简单和最干净的修复方法是将我的代码调整为如下所示:

int main() {

    char char digits[] = { 0x7e, 0x30, 0x6d, 0x79, 0x33, 0x5b, 0x5f, 0x70, 0x7f, 0x7b };

    std::fstream file;
    file.open( "display.txt, std::ios::out );

    for (int val = 0; val <= 255; val += 1)
        file << std::hex << +digits[val % 10] << " ";
    file << std::endl;

    // do the same for the rest of outputs to file...

    return 0;
}

我在这里所做的只是在每个chararrays 之前添加+

【讨论】:

    猜你喜欢
    • 2011-12-22
    • 1970-01-01
    • 2021-10-27
    • 2015-08-22
    • 2014-03-16
    • 1970-01-01
    • 2017-03-19
    • 1970-01-01
    • 2023-04-03
    相关资源
    最近更新 更多