C#读取二进制文件中的字符串

时间:2017-03-29 17:31:43

标签: c# hex

我有一些问题需要了解如何阅读不同于文本格式的文件。我知道在给定文件中有一些信息作为字符串。我设法将十六进制代码写入一个文本文件,这对我的过程的另一个功能有很大的帮助,因为我知道在一些十六进制代码组合之后,文件中可能会有字符串写入。

例如,我有这批十六进制代码。 00 39 AF 32 DD 24 BA 09 07 06 03 DB 我知道当十六进制代码等于AF 32时,下一个信息应该是字符串。例如:“发票编号223232”

任何帮助或参考将不胜感激。

亲切的问候,

static void Main(string[] args)
   {
      StreamWriter writer = new StreamWriter("output.txt", true);
      FileStream fs = new FileStream("File", FileMode.Open);
      int hexIn;
      String hex;
      for (int i = 0; (hexIn = fs.ReadByte()) != -1; i++)
      {
         writer.Write(hexIn + " ");
         hex = string.Format("{0:X2}", hexIn);
         writer.Write(hex + " ");
      }
  }

1 个答案:

答案 0 :(得分:0)

您拥有的示例代码看起来像是在尝试读取二进制文件,而不是十六进制编码的文本文件。

如果源文件是二进制文件(这是理想的),您将逐字节读取它,并通过状态机运行以了解何时需要字符串。你必须知道字符串有多长。在下面的示例中,我假设一个以null结尾的C风格字符串。对于pascal样式字符串,您可以读取长度前缀,或者对于固定宽度,只需跟踪预期的字符数。

bool done = false;
int state = 0;
StringBuilder result = new StringBuilder();
while (!done) {
   int byteValue = fs.ReadByte();
   if (bytesValue == -1)
      done = true; 
   else {
      switch (state) {
         case 0: //looking for 0xAF
            if (byteValue == 0xAF) 
               state = 1;
            break;
        case 1: //looking for 0x32
            if (byteValue == 0x32)
                state = 2;
            else
                state = 0;
            break;
        case 2: //start reading string
            if (byteValue == 0) {//end of C-style string
                //Do something with result.ToString()
                result.Clear();
                state = 0;  //go back to looking for more strings
            } else {
                result.Append((char)byteValue); //assuming 8-bit ASCII string
            }
            break;
      }
   }
}

如果您正在读取十六进制编码的文本文件,那将会更加困难,因为您必须一次读取十六进制半字节并重建字节,但状态机方法将类似。