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

C# 读取二进制文件中的字符串,c#,hex,C#,Hex,我在理解如何从不同于文本格式的格式读取文件时遇到了一些问题。我知道在给定的文件中有一些信息是字符串。我设法将十六进制代码写入一个文本文件,这对该过程的另一个功能有很大帮助,因为我知道在一些十六进制代码组合之后,文件中可能会写入字符串 例如,我有这批十六进制代码。 00 39 AF 32 DD 24 BA 09 07 06 03分贝 我知道当十六进制代码等于AF32时,下一个信息应该是字符串。例如:发票号码223232 任何帮助或参考都将不胜感激 亲切问候, static void Main(st

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

例如,我有这批十六进制代码。 00 39 AF 32 DD 24 BA 09 07 06 03分贝 我知道当十六进制代码等于AF32时,下一个信息应该是字符串。例如:发票号码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 + " ");
      }
  }

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

如果源文件是理想的二进制文件,您可以逐字节读取它,并运行状态机以了解何时需要字符串。你必须知道绳子有多长。在下面的示例中,我假设一个以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;
      }
   }
}

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

显示数据示例?尝试以下操作:字符串输入=00 39 AF 32 DD 24 BA 09 07 06 03 DB;byte[]output=input.Splitnew char[]{''},StringSplitOptions.RemoveEmptyEntries.Selectx=>byte.Parsex,System.Globalization.NumberStyles.HexNumber.ToArray;注意,DD 24 BA 09 07 06 03 DB在我见过的任何常见文本编码中看起来都不是字符串……是否有结束字节值?如果是这样的话,我认为这是一个很好的正则表达式的候选者。有一个字节表示内容长度您好,您完全正确,它是一个二进制文件。我尝试了您的代码,但byteValue返回的是整数,而不是0xAF或0x32。charbyteValue也适用于ISO 8859-1的假设。但为什么要假设,为什么要写得如此深奥?没有文本,只有编码文本。只需将字节序列收集到结果中,并在完全读取序列后使用编写的编码将其转换。我对我试图解释的文件类型做了一些研究:IBM的高级函数演示。长度指定不包括5A控制字符的记录长度的2字节字段。标识符ID指定结构化字段类型的3字节字段。标志字节指定数据字段信息的1字节字段。序列号标识记录的2字节字段。控件和数据文本控件代码、对象名称或用于定位图像或页面段的坐标。控制信息后面是数据,这些信息应该放在问题中。事实上,更新后的信息会使状态机变得更加复杂,而要求堆栈溢出上的某个人编写整个过程对社区来说是不合适的。我建议尝试使用我的示例编写一个状态机代码来开始,如果你被卡住了,可以发布一个新问题。