3

我有以下代码:

using (BinaryReader br = new BinaryReader(
       File.Open(FILE_PATH, FileMode.Open, FileAccess.ReadWrite)))
{
    int pos = 0;
    int length = (int) br.BaseStream.Length;

    while (pos < length)
    {
        b[pos] = br.ReadByte();
        pos++;
    }

    pos = 0;
    while (pos < length)
    {
        Console.WriteLine(Convert.ToString(b[pos]));
        pos++;
    }
}

FILE_PATH 是一个 const 字符串,其中包含正在读取的二进制文件的路径。二进制文件是整数和字符的混合体。每个整数为 1 个字节,每个字符以 2 个字节写入文件。

例如,该文件具有以下数据:

1你好,你好吗45你看起来很棒//等等

请注意:每个整数都与它后面的字符串相关联。所以 1 与“HELLO HOW ARE YOU”相关联,45 与“YOU ARE LOOKING GREAT”相关联,以此类推。

现在写入二进制文件(我不知道为什么,但我必须忍受这个),这样“1”将只占用 1 个字节,而“H”(和其他字符)每个占用 2 个字节。

所以这是文件实际包含的内容:

0100480045..等等以下是细分:

01 是整数 1 的第一个字节 0048 是 'H' 的 2 个字节(H 是 48 十六进制) 0045 是 'E' 的 2 个字节(E = 0x45)

等等..我希望我的控制台从这个文件中打印出人类可读的格式:我希望它打印“1 HELLO HOW ARE YOU”然后“45 YOU ARE LOOKING GREAT”等等......

我在做什么正确吗?有没有更简单/有效的方法?我的线 Console.WriteLine(Convert.ToString(b[pos])); 除了打印整数值而不是我想要的实际字符之外什么都不做。文件中的整数可以,但是如何读出字符?

任何帮助将非常感激。谢谢

4

3 回答 3

8

我认为您正在寻找的是Encoding.GetString

由于您的字符串数据由 2 个字节字符组成,因此如何获取字符串是:

for (int i = 0; i < b.Length; i++)
{
  byte curByte = b[i];

  // Assuming that the first byte of a 2-byte character sequence will be 0
  if (curByte != 0)
  { 
    // This is a 1 byte number
    Console.WriteLine(Convert.ToString(curByte));
  }
  else
  { 
    // This is a 2 byte character. Print it out.
    Console.WriteLine(Encoding.Unicode.GetString(b, i, 2));

    // We consumed the next character as well, no need to deal with it
    //  in the next round of the loop.
    i++;
  }
}
于 2009-08-20T21:45:22.183 回答
2

您可以使用 String System.Text.UnicodeEncoding.GetString() ,它接受一个 byte[] 数组并生成一个字符串。

我发现这个链接非常有用

请注意,这与盲目地将字节从 byte[] 数组复制到一大块内存中并将其称为字符串不同。例如,GetString() 方法必须验证字节并禁止无效代理。

于 2009-08-20T21:48:23.333 回答
0
using (BinaryReader br = new BinaryReader(File.Open(FILE_PATH, FileMode.Open, FileAccess.ReadWrite)))
{    
   int length = (int)br.BaseStream.Length;    

   byte[] buffer = new byte[length * 2];
   int bufferPosition = 0;

   while (pos < length)    
   {        
       byte b = br.ReadByte();        
       if(b < 10)
       {
          buffer[bufferPosition] = 0;
          buffer[bufferPosition + 1] = b + 0x30;
          pos++;
       }
       else
       {
          buffer[bufferPosition] = b;
          buffer[bufferPosition + 1] = br.ReadByte();
          pos += 2;
       }
       bufferPosition += 2;       
   }    

   Console.WriteLine(System.Text.Encoding.Unicode.GetString(buffer, 0, bufferPosition));

}

于 2009-08-20T21:56:27.263 回答