我试图从二进制文件中读取一条Unicode记录并存储在对象中,但是缓冲区的最后一个字节没有保存,为什么?
b = new byte[55];
file.read(b, 0, b.length)
set(b);
private static int sizePtr = 4;
private static int sizeBf = 50;
private byte deleteTag ;
private byte []buf = new byte[sizeBf];
private byte []pointer = new byte[sizePtr];
public void set( byte[] b)
{
deleteTag = b[0];
Int32 l;
for (l = 0; l < sizeOfBuffer(); l++)
buf[l] = b[l+1];
for (int i = 0; i < sizePtr; i++, l++)
pointer[i] = b[l];
}
答案 0 :(得分:3)
您没有指定具体的用例,但我会说您需要的是BinaryReader类。如果您想要读取包含您知道其结构的数据的二进制文件,这将非常有用。在你的情况下,它可能是这样的:
var br = new BinaryReader(File.OpenRead(filePath));
private static int sizePtr = 4;
private static int sizeBf = 50;
private byte deleteTag ;
private byte []buf = new byte[sizeBf];
private byte []pointer = new byte[sizePtr];
//read deleteTag
deleteTag = br.ReadByte();
buf = br.ReadBytes(sizeBf);
pointer = br.ReadBytes(sizePtr);
如果您的指针是4字节整数值,您也可以这样做:
pointer = br.ReadUInt32();
因此,如果您的二进制文件非常复杂,那么binaryReader将非常有用。
答案 1 :(得分:1)
第一个循环的最后一次执行有l=49
(假设sizeofBuffer()
只返回sizeBf
),这使得
buf[49] = b[50]
之后,第二个循环的第一次执行有l=50
,这使你的代码执行
pointer[0] = b[50]
然后该循环的最后一次执行将是
pointer[3] = b[53]
鉴于此,您正在丢失最后一个字节。我建议将第二个循环更改为
for (int i = 0; i < sizePtr; i++, l++)
pointer[i] = b[l+1];
除非您的代码中没有显示更多处理。