文件中其他HEX项值相同

本文关键字:HEX 其他 文件 | 更新日期: 2023-09-27 17:50:53

我正在运行两个执行相同代码的程序:写入二进制文件。

当c++代码保存一个值为2的一个字节到文件时,它似乎是二进制存储为HEX 02。然而,当我的c#程序将其写入文件时,它似乎被存储为HEX 32。

可能这与字符编码UTF_16是c#中的默认值有关吗?(如果我没看错几天前的一篇文章的话)

是否有办法确保c#将字节值2写入文件为HEX 02而不是HEX 32 ?

            EndianBinaryWriter writer = new EndianBinaryWriter(new FileStream("myfile.dat", Endian.Little);
            char LineDepth = '4';
            if(MaxDev<=127) {
                LineDepth = '1';
            } else
            if(MaxDev<=32767) {
                LineDepth = '2';
            }
            // write line header
            //char BlockBuf[5];
            //MemoryStream BlockBuf = new MemoryStream();
            //EndianBinaryWriter BlockBufWriter = new EndianBinaryWriter(endian, BlockBuf);
            //hfzMemcpy(BlockBuf, &LineDepth, 1); // store line depth
            //hfzMemcpy(BlockBuf+1, &FirstVal, 4); // store first value (32bit precis)
            writer.Write(LineDepth);

这是代码的一小部分摘录,但它应该给出了意图。我喜欢只写一个字节值为1 2或4取决于某个if语句。现在我一直认为char是一个字节所以我试着把它写成char但这似乎是错误的因为当我把它与文件进行比较时它应该是HEX 02而我的文件是HEX 32

<标题> 更新

John告诉我,通过将源文件中的字节值2放入char中,我不是将值2放入该char中,而是将值32放入该char中,这导致我的结果文件损坏。有点像菜鸟犯的错误,但也许我的问题将来会对其他菜鸟有所帮助?

文件中其他HEX项值相同

您正在编写字符 '4', '1'或'2' -在UTF-16中编码为0x00 0x34(等)。

在我看来,你想写一个shortushort值或4,1或2:

short lineDepth = 4;
if (MaxDev <= 127) {
    lineDepth = 1;
} else
if (MaxDev <= 32767) {
    lineDepth = 2;
}
writer.Write(lineDepth);

注意,这仍然写入两个字节。如果你只是想写一个单个字节(你的帖子和你的评论似乎说的是不同的事情),你想:

byte lineDepth = 4;
if (MaxDev <= 127) {
    lineDepth = 1;
} else
if (MaxDev <= 32767) {
    lineDepth = 2;
}
writer.Write(lineDepth);

理解1(整数常量)和'1'(字符常量)之间的区别非常重要。你应该尽量避免使用文本,除非你真的试图表示文本。

还要注意"hex"只是查看文件的一种方式。没有"十六进制条目"这样的东西——只有字节。因此,值为"16"的字节可以被视为16(十进制)或0x10(十六进制)。这是查看相同内容的两种不同方式。