1

是的,我已经阅读了大约 5 个小时的解决方案,但它们都不起作用。BitConverter 只是创建一个空白字符串。

基本上我正在做的是尝试创建一个级别阅读器,它将通过十六进制读取级别内容并最终将其显示在树视图中。所以我要做的第一件事就是创建一个字节数组,我可以在其中编辑数据,我已经做到了。但是,现在我想在屏幕上显示数据。据我所知,您不能在屏幕上显示字节数组,您必须先将其转换为字符串。

所以这就是我想要做的:

        using (OpenFileDialog fileDialog = new OpenFileDialog())
        {
            if (fileDialog.ShowDialog() != DialogResult.Cancel)
            {
                textBox1.Text = fileDialog.FileName;
                using (BinaryReader fileBytes = new BinaryReader(new MemoryStream(File.ReadAllBytes(textBox1.Text))))
                {
                    string s = null;
                    int length = (int)fileBytes.BaseStream.Length;
                    byte[] hex = fileBytes.ReadBytes(length);
                    File.WriteAllBytes(@"c:\temp_file.txt", hex);
                }
            }
        }
    }

注意:我已经删除了我的转换尝试,因为我没有尝试过任何工作。有谁知道我如何使用这些数据并将其转换为字符串,并将其添加到文本框中?(当然,我知道如何做后者。我遇到困难的是前者。)如果是这样,请提供示例。

我可能应该让自己更清楚;我不想将字节转换为相应的字符(即如果它是0x43,我不想打印'C'。我想打印'43'。

4

4 回答 4

3

您可以将数据转换为十六进制:

  StringBuilder hex = new StringBuilder(theArray.Length * 2);
  foreach (byte b in theArray)
    hex.AppendFormat("{0:x2}", b);
  return hex.ToString();
于 2012-09-11T08:24:01.210 回答
2

你知道你的字节数组存储在哪种编码中吗?

你需要Encoding.GetString方法

这是MSDN示例

using System;
using System.IO;
using System.Text;

public class Example
{
   const int MAX_BUFFER_SIZE = 2048;
   static Encoding enc8 = Encoding.UTF8;

   public static void Main()
   {
      FileStream fStream = new FileStream(@".\Utf8Example.txt", FileMode.Open);
      string contents = null;

      // If file size is small, read in a single operation. 
      if (fStream.Length <= MAX_BUFFER_SIZE) {
         Byte[] bytes = new Byte[fStream.Length];
         fStream.Read(bytes, 0, bytes.Length);
         contents = enc8.GetString(bytes);
      }
      // If file size exceeds buffer size, perform multiple reads. 
      else {
         contents = ReadFromBuffer(fStream);
      }
      fStream.Close();
      Console.WriteLine(contents);
   }

   private static string ReadFromBuffer(FileStream fStream)
   {
        Byte[] bytes = new Byte[MAX_BUFFER_SIZE];
        string output = String.Empty;
        Decoder decoder8 = enc8.GetDecoder();

        while (fStream.Position < fStream.Length) {
           int nBytes = fStream.Read(bytes, 0, bytes.Length);
           int nChars = decoder8.GetCharCount(bytes, 0, nBytes);
           char[] chars = new char[nChars];
           nChars = decoder8.GetChars(bytes, 0, nBytes, chars, 0);
           output += new String(chars, 0, nChars);                                                     
        }
        return output;
    }
}
// The example displays the following output: 
//     This is a UTF-8-encoded file that contains primarily Latin text, although it 
//     does list the first twelve letters of the Russian (Cyrillic) alphabet: 
//      
//     А б в г д е ё ж з и й к 
//      
//     The goal is to save this file, then open and decode it as a binary stream.

编辑

如果你想以十六进制格式打印出字节数组,BitConverter就是你正在寻找的形式,这里是MSDN示例

// Example of the BitConverter.ToString( byte[ ] ) method. 
using System;

class BytesToStringDemo
{
    // Display a byte array with a name. 
    public static void WriteByteArray( byte[ ] bytes, string name )
    {
        const string underLine = "--------------------------------";

        Console.WriteLine( name );
        Console.WriteLine( underLine.Substring( 0, 
            Math.Min( name.Length, underLine.Length ) ) );
        Console.WriteLine( BitConverter.ToString( bytes ) );
        Console.WriteLine( );
    }

    public static void Main( )
    {
        byte[ ] arrayOne = {
             0,   1,   2,   4,   8,  16,  32,  64, 128, 255 };

        byte[ ] arrayTwo = {
            32,   0,   0,  42,   0,  65,   0, 125,   0, 197,
             0, 168,   3,  41,   4, 172,  32 };

        byte[ ] arrayThree = {
            15,   0,   0, 128,  16,  39, 240, 216, 241, 255, 
           127 };

        byte[ ] arrayFour = {
            15,   0,   0,   0,   0,  16,   0, 255,   3,   0, 
             0, 202, 154,  59, 255, 255, 255, 255, 127 };

        Console.WriteLine( "This example of the " +
            "BitConverter.ToString( byte[ ] ) \n" +
            "method generates the following output.\n" );

        WriteByteArray( arrayOne, "arrayOne" );
        WriteByteArray( arrayTwo, "arrayTwo" );
        WriteByteArray( arrayThree, "arrayThree" );
        WriteByteArray( arrayFour, "arrayFour" );
    }
}

/*
This example of the BitConverter.ToString( byte[ ] )
method generates the following output.

arrayOne
--------
00-01-02-04-08-10-20-40-80-FF

arrayTwo
--------
20-00-00-2A-00-41-00-7D-00-C5-00-A8-03-29-04-AC-20

arrayThree
----------
0F-00-00-80-10-27-F0-D8-F1-FF-7F

arrayFour
---------
0F-00-00-00-00-10-00-FF-03-00-00-CA-9A-3B-FF-FF-FF-FF-7F
*/
于 2012-09-11T08:21:26.357 回答
1

首先,您只需要将字节转换为更有用的东西,例如 UTF8,然后您就可以从中获取字符串。类似的东西(在我的例子中:iso-8859-1):

buf = Encoding.Convert(Encoding.GetEncoding("iso-8859-1"), Encoding.UTF8, buf);
tempString = Encoding.UTF8.GetString(buf, 0, count);
于 2012-09-11T08:20:57.010 回答
1

实际上没有显示随机字节序列的默认方式。选项:

  • base64 编码 (Convert.ToBase64String) - 将产生不可读但至少可安全打印的字符串
  • 十六进制编码每个字节并在每个字节的表示之间用空格连接,可能分成每行几个(即16个)字节的组。- 会产生更多类似黑客的观点。
  • 将所有字节映射到可打印的字符(可能是彩色的)并可能分成多行 - 将产生类似矩阵的数据视图......
于 2012-09-11T08:26:04.203 回答