所以我需要读取一个十六进制内有'word'的文件(ACSII)。当然,单词可以是任意长度,但总是从偏移量0x1290开始。我想要做的是读取从偏移0x1290开始的文件的十六进制,并继续UNTIL遇到空字节(00)。到目前为止,我所尝试的所有编码似乎都需要一个固定的长度来阅读。
filePath = "C:\myfile"
BinaryReader reader = new BinaryReader(new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.None));
reader.BaseStream.Position = 0x1290; // The starting offset
byte[] word = reader.ReadBytes(); // Must specify length within ReadBytes(e.g. 0x99)
reader.Close();`
在所需的'字'之后,通常可能存在不需要的其他十六进制数据,但是在'字'之后总是有一个空字节。这就是我无法指定长度的原因。
答案 0 :(得分:0)
使用while循环:
filePath = "C:\myfile"
BinaryReader reader = new BinaryReader(new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.None));
reader.BaseStream.Position = 0x1290;
byte char;
byte[] result=new byte[length_of_the_word];
int i=0;
while(((byte)char=reader.Read())!=-1)
{
result[i++]=char;
}
reader.close();
然后用结尾字hex替换-1(文件结尾),如0x00
答案 1 :(得分:0)
如果您不知道字符串的长度有多少个字符,您应该使用某种类型的集合,这些集合事先并不需要存储的确切数据长度。这似乎是List<byte>
List<byte> bits = new List<byte>();
using(FileStream s = new FileStream(@"C:\myfile", FileMode.Open))
using (BinaryReader reader = new BinaryReader(s))
{
reader.BaseStream.Position = 0x1290;
while (reader.PeekChar() != -1)
{
byte b = reader.ReadByte();
if(b != 0x00)
bits.Add(reader.ReadByte());
}
string result = Encoding.UTF8.GetString(bits.ToArray());
}
答案 2 :(得分:0)
谢谢大家,我尝试了上面提到的,但他们似乎总是遇到错误。无论如何,我自己想出了一个循环,并在这里分享:
int c = 0;
int runs = 0;
byte[] data = new byte[400]; // byte array setup
// read hex values (loop) and convert to acsii string
BinaryReader reader = new BinaryReader(new FileStream("C:\File", FileMode.Open, FileAccess.Read, FileShare.None));
reader.BaseStream.Position = 0x1290;
while (c == 0)
{
data[runs] = reader.ReadByte();
if (data[runs] == 0x00)
{
c = 1; // stop loop at .ReadByte = 0x00
}
runs++;
}
reader.Close();
// hex to acsii string, removing null bytes
result = Encoding.Default.GetString(data.Where(x => x != 0).ToArray());
似乎运作良好