Подтвердить что ты не робот

С#: преобразование байтового массива в строку и распечатку на консоль

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

Это простой фрагмент: прочитайте первые 6 байтов файла и преобразуйте его в строку.

Однако консоль показывает System.Byte[].

Возможно, я использую неправильный класс для преобразования. Что я должен использовать? В конечном итоге он будет анализировать имена файлов, закодированные в UTF-8, и я планирую использовать тот же метод для чтения всех имен файлов.

4b9b3361

Ответ 1

На самом деле:

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

или для UTF-8:

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

Ответ 2

Я был в затруднительном положении, когда у меня был подписанный массив байтов (sbyte[]) в качестве входных данных для класса Test, и я хотел заменить его на обычный массив байтов (byte[]) для простота. Я приехал сюда из поиска Google, но ответ Том мне не помог.

Я написал вспомогательный метод для распечатки инициализатора заданного byte[]:

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

Вы можете использовать его следующим образом:

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

Вывод действителен С#, который затем можно просто скопировать в ваш код.

И только для полноты, вот метод UnsignedBytesFromSignedBytes:

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

Ответ 3

Это просто обновленная версия кода Jesse Webbs, которая не добавляет лишний символ ,.

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

Результатом этого метода будет:

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

Ответ 4

Я использовал этот простой код в своей кодовой базе:

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

Для использования:

Console.WriteLine(ToReadableByteArray(bytes));

Ответ 5

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

 string stringByte= BitConverter.ToString(bytes);

 Console.WriteLine(stringByte);

Ответ 6

Для забавы с linq и интерполяцией строк:

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

Тестовые случаи:

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

Выход:

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