我正在运行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,这导致我生成的文件损坏。这是一个新秀的错误,但也许我的问题将在未来帮助其他新秀?
答案 0 :(得分:2)
您正在撰写字符&#39; 4&#39;,&#39; 1&#39;或者&#39; 2&#39; - 以UTF-16编码为0x00 0x34(等)。
在我看来,您想要写一个short
或ushort
值或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(十六进制)。这是查看完全相同内容的两种不同方式。