C# 将ByteArray转换为字符串以在文本框c中使用#

C# 将ByteArray转换为字符串以在文本框c中使用#,c#,arrays,string,type-conversion,C#,Arrays,String,Type Conversion,是的,我已经阅读了大约5个小时的解决方案,没有一个有效。 BitConverter只创建一个空白字符串 基本上,我正在做的是创建一个levelreader,它将通过hex读取levels内容,并最终在树视图中显示它。所以我要做的第一件事是制作一个字节数组,我可以在其中编辑数据,我已经做到了。 但是,现在我想在屏幕上显示数据。据我所知,不能在屏幕上显示字节数组,必须先将其转换为字符串 这就是我想做的: using (OpenFileDialog fileDialog = new O

是的,我已经阅读了大约5个小时的解决方案,没有一个有效。 BitConverter只创建一个空白字符串

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

这就是我想做的:

        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”。

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


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


您知道字节数组存储在哪个编码中吗

你需要方法

下面是一个例子


您知道字节数组存储在哪个编码中吗

你需要方法

下面是一个例子


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

  StringBuilder hex = new StringBuilder(theArray.Length * 2);
  foreach (byte b in theArray)
    hex.AppendFormat("{0:x2}", b);
  return hex.ToString();

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

  StringBuilder hex = new StringBuilder(theArray.Length * 2);
  foreach (byte b in theArray)
    hex.AppendFormat("{0:x2}", b);
  return hex.ToString();

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

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

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

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


我想你不知道-但是你的二进制文件格式使用什么文本编码?问题是,我们不知道你尝试过哪些解决方案。也就是说,你见过吗?还有,在二进制读取器的内存流中包装一个字节数组,然后再转换回一个字节数组有什么用?@Damien_The_unsiver-这两种方法在公认的answe中都有r实际上是可行的;但它们只适用于10kb左右的文件。其他任何文件都不可行,而且需要很长时间才能实现。(阅读时间超过1分钟).有什么想法吗?我想你不知道-但是你的二进制文件格式使用什么文本编码?问题是,我们不知道你尝试过哪些解决方案。也就是说,你看到了吗?还有,在二进制读取器的内存流中包装一个字节数组,然后再转换回一个字节数组有什么用?@Damien_The_unsiver-这两种方法都在Accept中d答案确实有效;但它们只适用于10kb左右的文件。还有其他问题,而且要花很长时间才可行。(阅读时间超过1分钟)。有什么想法吗?+1.如果源文件是文本,则有用(而且问题中的情况似乎并非如此)@AlexeiLevenkov,如果我们想将字节数组转换为文本,它应该包含任何编码中的文本字节,我错了吗?我不知道OP想要什么“将字节数组转换为文本”…但听起来OP希望至少有可打印的输出(可能字符至少在0-31范围之外)。在大多数情况下,您的示例不提供可打印输出,不确定“任何编码”是什么意思:如果源是文本,并且您选择了错误的编码,则将获得不可用的输出(或无效UTF8序列的例外),如果源代码是随机的字节序列,它不能用任何常规编码转换为可打印文本…啊,是的@AlexeiLevenkov,你是对的,如果我们是说可打印输出,我的代码是可用的,我可能应该让我自己更清楚;我不想将字节转换为相应的字符(也就是说,如果是0x43,我不想打印“C”。我想打印“43”。+1.如果源是文本,这很有用(而且问题似乎不是这样)。@AlexeiLevenkov,如果我们想将字节数组转换为文本,它应该在任何编码中包含文本字节,我错了吗?我不知道OP想要什么“将字节数组转换为文本”…但听起来OP希望至少有可打印输出(可能字符至少在0-31范围之外)。在大多数情况下,您的示例不提供可打印输出,不确定“任何编码”是什么意思:如果源是文本,并且您选择了错误的编码,则将获得不可用的输出(或无效UTF8序列的例外),如果源代码是随机的字节序列,它不能用任何常规编码转换为可打印文本…啊,是的@AlexeiLevenkov,你是对的,如果我们是说可打印输出,我的代码是可用的,我可能应该让我自己更清楚;我不想将字节转换为相应的字符(也就是说,如果它是0x43,我不想打印“C”。我想打印“43”。+1。这会让你得到十六进制数…通常用更喜欢的LINQ单语句:)但这一个对于非专家来说更可读。我试着这样做,打印时,它打印的都是
Sys
// 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
*/
  StringBuilder hex = new StringBuilder(theArray.Length * 2);
  foreach (byte b in theArray)
    hex.AppendFormat("{0:x2}", b);
  return hex.ToString();