与文件中的其他HEX条目值相同

时间:2014-03-19 13:43:18

标签: c# c++ character-encoding

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

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

这是否与char编码有关?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,这导致我生成的文件损坏。这是一个新秀的错误,但也许我的问题将在未来帮助其他新秀?

1 个答案:

答案 0 :(得分:2)

您正在撰写字符&#39; 4&#39;,&#39; 1&#39;或者&#39; 2&#39; - 以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(一个整数常数)和&#39; 1&#39;之间的区别。 (一个字符常数)。您应该尝试避免使用文字,除非您真的试图表示文字。

另请注意&#34; hex&#34;只是查看文件的一种方式。没有&#34; hex条目&#34; - 只有字节。所以字节的值为&#34;十六&#34;可以看作16(十进制)或0x10(十六进制)。这是查看完全相同内容的两种不同方式。