C++ 将十六进制值写入文本文件,显示为二进制

C++ 将十六进制值写入文本文件,显示为二进制,c++,hex,text-files,fstream,C++,Hex,Text Files,Fstream,我有一个简单的程序,我正在尝试以以下格式将字节模式的十六进制值序列写入文本文件: 任意数据表示 这是我的节目 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 (i

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

任意数据表示

这是我的节目

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的组合有关

当使用char、unsigned char、std::uint8\u t和std::int8\u t时,我得到了这个二进制转储。但是,如果我使用short、int、unsigned int、std::uint16\u t或std::int16\u t,它似乎在打印十六进制值

使用非char类型的整型时。。。我得到以下输出:

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
我想这可能会解决我自己的问题,但我仍然想知道为什么我会在std::hex中使用char类型得到输出

这是记事本中的一个bug

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

记事本有一个算法,试图推断文件使用的编码类型。它调用的实际Windows API被调用。该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标记的更多信息:

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

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;
}

我在这里所做的就是在每个字符前加上+

字符和字符串参数(例如char或const char*类型)由运算符的非成员重载处理。在构造和检查sentry对象后,插入字符ch。因此,如果您想使用像ostream&@John这样似乎有意义的整数,则调用。有时候,你会忘记或忽略一些简单的事情。为了一些简单的事情,我摇了将近半个小时的头。。。然后我开始尝试使用不同类型的同一个程序…我仍在琢磨为什么在输出中会出现这些非ascii字符。0x7e是a~。第一个字符应该是~。没有考虑先将其传递给stringstream,然后将其推送到文件流中进行写入。。。这比使用显式强制转换的注释建议要好。。。对于我的一般目的,它可以是一个int 64哈哈。。。我所关心的是在文本文件中获得正确的十六进制值!实际上,我完全修改了我的答案,以表明这是记事本中的一个bug,而不是您的代码本身。您仍然可以执行StrugScript技巧,但我怀疑它会产生同样的问题。也许,但我仍然认为整个问题涉及C++如何用输出流对待字符类型。例如,如果我有:char c='a';实际上,我不认为它和诸如iostream和fstream之类的流类型有任何直接关系。我认为这是处理流对象的操作符内部工作的一部分。但是,您所建议的关于字节顺序标记以及文本编辑器在打开文件时如何在文件头中查找它们的内容非常有用,值得注意!
file.open("display.txt", std::ios::out);

const char* utf7_bom = "+/v8";
file << utf7_bom;
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;
}