在C#中以十六进制模式读取输入文件

时间:2014-09-15 15:32:08

标签: c# byte filestream binaryreader

文件信息:前4个字节包含文件中的记录数|接下来的4个字节包含第一个记录的长度。再次记录后,4个字节包含第二个记录的长度。整个文件是这样的。所以我必须读取输入文件并跳过前4个字节。之后,我需要读取4个字节,这将给出我即将到来的记录的长度,并在字符串中写出记录并重复该过程。

我没有得到我应该得到的东西。例如: 对于7F CB 00 00,我应该得到32715(我不需要,需要跳过)。接下来是4个字节 00 D3 00 00 00我应该得到211,但我没有得到。

任何帮助都将不胜感激。

private void button1_Click(object sender, EventArgs e)
    {
        FileStream readStream;
        readStream = new FileStream(singlefilebox.Text,FileMode.Open,FileAccess.Read);
        BinaryReader readBinary = new BinaryReader(readStream);


        byte inbyte;
        inbyte = readBinary.ReadByte();
        string outbyte;
        while (readBinary.BaseStream.Position < readBinary.BaseStream.Length)
        {
            inbyte = readBinary.ReadByte();
            outbyte = Convert.ToString(inbyte);
        }

1 个答案:

答案 0 :(得分:0)

第一个问题是您如何进行输出。当您生成outbyte时,它将被转换为十进制表示法。例如,CB转换为203.

将生成outbyte的行更改为以下内容:

outbyte = Convert.ToString(String.Format("{0:X}", inbyte));

这将打印十六进制数字的字符串表示形式。

有关字符串格式的更多详细信息,请参阅此答案。 String.Format for Hex

更大的问题是你需要以正确的方式组合字节。您需要读取每个字节,将其移位8位,然后添加下一个字节。

        string fileName = @"..\..\TestInput.hex";
        FileStream readStream;
        readStream = new FileStream(fileName, FileMode.Open, FileAccess.Read);
        BinaryReader readBinary = new BinaryReader(readStream);

        byte inbyte;
        string outbyte;
        int value;

        inbyte = readBinary.ReadByte(); // read in the value: 7F in hex , 127 in decimal
        value = inbyte << 8; // shift the value 8 bits to the left: 7F 00 in hex, 32512 in decimal
        inbyte = readBinary.ReadByte(); // read in the next value: CB in hex, 203 in decimal
        value += inbyte; // add the second byte to the first: 7F CB in hex, 32715 in decimal
        Console.WriteLine(value); // writes 32715 to the console