C#:将字节数组转换为字符串并打印到控制台


C#: Converting byte array to string and printing out to console

1
2
3
4
5
public void parse_table(BinaryReader inFile)
{
    byte[] idstring = inFile.ReadBytes(6);
    Console.WriteLine(Convert.ToString(idstring));
}

这是一个简单的片段:读取文件的前6个字节并将其转换为字符串。

但是控制台显示System.Byte[]

也许我用的是错误的课程。我应该用什么?它最终将解析以UTF-8编码的文件名,我计划使用相同的方法读取所有文件名。


事实上:

1
    Console.WriteLine(Encoding.Default.GetString(value));

或者对于UTF-8:

1
    Console.WriteLine(Encoding.UTF8.GetString(value));


我当时处于一种困境,我有一个带符号的字节数组(sbyte[]作为测试类的输入,为了简单起见,我想用一个普通的字节数组(byte[]替换它。我是从谷歌搜索到这里的,但汤姆的回答对我没用。

我编写了一个助手方法来打印给定byte[]的初始值:

1
2
3
4
5
6
7
8
9
10
public void PrintByteArray(byte[] bytes)
{
    var sb = new StringBuilder("new byte[] {");
    foreach (var b in bytes)
    {
        sb.Append(b +",");
    }
    sb.Append("}");
    Console.WriteLine(sb.ToString());
}

您可以这样使用它:

1
2
3
4
5
var signedBytes = new sbyte[] { 1, 2, 3, -1, -2, -3, 127, -128, 0, };
var unsignedBytes = UnsignedBytesFromSignedBytes(signedBytes);
PrintByteArray(unsignedBytes);
// output:
// new byte[] { 1, 2, 3, 255, 254, 253, 127, 128, 0, }

输出是有效的C,然后可以将其复制到代码中。

为了完整起见,这里是UnsignedBytesFromSignedBytes方法:

1
2
3
4
5
6
7
// http://stackoverflow.com/a/829994/346561
public static byte[] UnsignedBytesFromSignedBytes(sbyte[] signed)
{
    var unsigned = new byte[signed.Length];
    Buffer.BlockCopy(signed, 0, unsigned, 0, signed.Length);
    return unsigned;
}


这只是JesseWebbs代码的一个更新版本,它没有附加不必要的尾随,字符。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static string PrintBytes(this byte[] byteArray)
{
    var sb = new StringBuilder("new byte[] {");
    for(var i = 0; i < byteArray.Length;i++)
    {
        var b = byteArray[i];
        sb.Append(b);
        if (i < byteArray.Length -1)
        {
            sb.Append(",");
        }
    }
    sb.Append(" }");
    return sb.ToString();
}

此方法的输出将是:

1
new byte[] { 48, ... 135, 31, 178, 7, 157 }

我在代码库中使用了这个简单的代码:

1
2
3
4
static public string ToReadableByteArray(byte[] bytes)
{
    return string.Join(",", bytes);
}

使用:

1
Console.WriteLine(ToReadableByteArray(bytes));

1
2
3
4
5
 byte[] bytes = { 1,2,3,4 };

 string stringByte= BitConverter.ToString(bytes);

 Console.WriteLine(stringByte);

对于Linq和字符串插值的一些乐趣:

1
2
3
4
5
6
public string ByteArrayToString(byte[] bytes)
{
    if ( bytes == null ) return"null";
    string joinedBytes = string.Join(",", bytes.Select(b => b.ToString()));
    return $"new byte[] {{ {joinedBytes} }}";
}

测试用例:

1
2
3
4
byte[] bytes = { 1, 2, 3, 4 };
ByteArrayToString( bytes ) .Dump();
ByteArrayToString(null).Dump();
ByteArrayToString(new byte[] {} ) .Dump();

输出:

1
2
3
new byte[] { 1, 2, 3, 4 }
null
new byte[] {  }