C# -- BinaryReader and Little Endian
本文关键字:Little Endian and BinaryReader | 更新日期: 2023-09-27 18:24:43
我必须读取一个二进制文件,所以我使用以下代码:
static void ReadBin()
{
var sectors = new List<Sector>();
using (var b = new BinaryReader(File.Open("C:''LOG.BIN", FileMode.Open)))
{
const int offset = 4096;
const int required = 2;
int pos = 0;
var length = (int)b.BaseStream.Length;
while (pos < length)
{
for (int i = 1; i <= 640; i++)
{
pos = (offset*i)-2;
b.BaseStream.Seek(pos, SeekOrigin.Begin);
// Read the next 2 bytes.
byte[] by = b.ReadBytes(required);
sectors.Add(new Sector { Number = i, Position = pos, Type = Sector.SetTypeFromExadecimalString(ByteArrayToString(@by)) });
pos = pos + 2;
}
}
}
}
正如您所看到的,ByteArrayToString获取字节数组并写入一个字符串。ByteArrayToString的代码为:
public static string ByteArrayToString(byte[] ba)
{
StringBuilder hex = new StringBuilder(ba.Length * 2);
foreach (byte b in ba)
hex.AppendFormat("{0:x2}", b);
return string.Format("0x{0}", hex.ToString().ToUpper());
}
编写.bin文件的机器用LittleEndian编写。因此,在StackOverflow线程".NET BinaryReader总是小端序吗,即使在大端序系统上也是如此?"之后,我应该是"all"LittleEndian格式(ReadBytes和机器生成的文件)。问题是函数ByteArrayToString()给了我这样的结果:0xF0FF在BigEndian中,而不是在LittleEndian中(事实上,我想我应该接收0xFFF0),因为在那之后我必须解码很多数据,并且我不能确定结果的一致性(我没有什么可比较的),我不想在解码.bin文件时出现问题,如何获得0xFFF0?
BinaryReader
的endianness只影响ReadInt32
等方法。它不会影响ReadBytes
-它将始终按字节在流中出现的顺序返回字节。
如果在特定的排序中需要一个字节数组(或其十六进制表示),则必须自己执行该排序。
如果文件已经在您想要的endianness中,那么很可能您只是读取了错误的数据。我不会对此感到完全惊讶——您正在重新定位底层流,而BinaryReader
可能没有意识到这一点。如果它已经将16个字节读取到缓冲区中,那么在您读取完所有缓冲区时,它可能不会再次从流中读取。我建议你把BinaryReader
从等式中去掉,只使用Stream
——写你自己的等效ReadBytes
并不难,它只是循环,直到数据用完或读取你需要的所有数据。