简体   繁体   中英

C# Reading String inside a binary file

I have some problems to understand how reading files from different format than the text format. I know that inside a given file there are some information as string. I managed to write the hex code to a text file which is helping me a lot for another function of the process, because I know that after some combinations of hex codes there might be string writed in the file.

For instance, I have this batch of hex codes. 00 39 AF 32 DD 24 BA 09 07 06 03 DB I know that when the hex codes are equal to AF 32 the next information should be the string. For instance: "Invoice Number 223232"

Any help or reference will be appreciated.

Kind regards,

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 + " ");
      }
  }

The sample code you have looks like you are trying to read a binary file, not a hex-encoded text file.

If the source file is binary (which is ideal), you would read it byte-by-byte, and run through a state machine to know when to expect a string. You would have to know how long the string is. In the sample below I am assuming a null-terminated C-style string. For pascal style strings you would read a length prefix, or for fixed width just keep track of the expected number of character.

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;
      }
   }
}

If you are reading a hex-encoded text file, it would be more difficult, as you would have to read hex nibbles at a time and reconstruct the bytes, but the state machine approach would be similar.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM