从文件读取十六进制数据,从位置x开始,以第一个空字节(00)结束?

时间:2015-12-26 22:14:47

标签: c# .net c#-4.0 hex filereader

所以我需要读取一个十六进制内有'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();`

在所需的'字'之后,通常可能存在不需要的其他十六进制数据,但是在'字'之后总是有一个空字节。这就是我无法指定长度的原因。

3 个答案:

答案 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());

似乎运作良好