【问题标题】:Print an array as hex values in c#在c#中将数组打印为十六进制值
【发布时间】:2015-10-29 00:26:32
【问题描述】:

我想将数组打印为十六进制。在以下代码中,“缓冲区”已被“XBaseRead”填充。我可以使用 foreach 循环和格式“{0:X2}”以十六进制打印,但是当我使用具有相同格式的 string.join 方法时,它会以十进制打印。

代码如下:

byte[] buffer = new byte[160];
XBaseFunctions.XBaseRead(df2500VENDR, buffer, 160, false, XBaseFunctions.O_FLAG._O_BINARY);
foreach (byte i in buffer)
{
    Console.Write("{0:X2} ", i);
}
Console.WriteLine("\n");
Console.WriteLine("{0:X2}", string.Join(", ", buffer));

这是输出:

-----------------Dump of raw buffer-----------------

F0 F0 F0 F0 C1 F0 F1 F0 C1 40 C1 D5 E3 C8 D6 D5 E8 40 50 40 E2 D6 D5 E2 40 C9 D5
 C3 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 F1 F4 F5 F0 40 E
6 40 F2 F1 E2 E3 40 E2 E3 5C C5 D9 C9 C5 6B 40 D7 C1 40 40 40 F1 F6 F5 F0 F2 40
40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40
 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 00 00 00 00 00 0
0 00 00 00 00 00 00 F9 60 03 A7 7E 3E 7E 3F 00 00 00 00 00 00 00 00 40 40 40 40


240, 240, 240, 240, 193, 240, 241, 240, 193, 64, 193, 213, 227, 200, 214, 213, 2
32, 64, 80, 64, 226, 214, 213, 226, 64, 201, 213, 195, 64, 64, 64, 64, 64, 64, 6
4, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 241, 244, 245, 240, 64, 2
30, 64, 242, 241, 226, 227, 64, 226, 227, 92, 197, 217, 201, 197, 107, 64, 215,
193, 64, 64, 64, 241, 246, 245, 240, 242, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64
, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64
, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0,
 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 249, 96, 3, 167, 126, 62, 126, 63, 0, 0, 0, 0,
 0, 0, 0, 0, 64, 64, 64, 64

所以问题是为什么 {0:X2} 对 foreach 循环有效,但对 string.join 方法无效?

另外,如果有人能告诉我如何将每行限制为 16 个字节,那么我也将不胜感激。

【问题讨论】:

    标签: c# arrays


    【解决方案1】:

    您应该首先在每个字节上应用ToString("X2")

    Console.WriteLine(string.Join(", ", buffer.Select(b => b.ToString("X2"));
    

    【讨论】:

    • 请务必加上“using System.Linq;” (对于“选择”)在文件顶部,并使用右括号的正确数量:使用 System.Linq; Console.Writeline(string.Join(", ", buffer.Select(b => b.ToString("X2"))));
    【解决方案2】:

    因为当您执行 foreach 循环时,您将一个字节传递给格式化的 Console.WriteLine()。但是,您在另一个实例中传递了整个连接缓冲区的字符串,因为 string.Join(", ", buffer) 返回一个字符串。

    foreach (byte i in buffer)
    {
        Console.Write("{0:X2} ", i); // <- A byte is being passed.
    }
    
    Console.WriteLine("{0:X2}", string.Join(", ", buffer)); // <- A string is being passed.
    

    我会用这个:

     var str = string.Join(", ", buffer.Select(x => string.Format("{0:X2}", x)));
     Console.WriteLine(str);
    

    ...或者这个:

    var str = string.Concat(buffer.Select(i => string.Format("{0:X2}, ", i)))
    Console.WriteLine(str);
    

    虽然第一个没有逗号,所以我会在第二种方法中使用它。不过,我想我会分享实现它的不同方法。

    希望你熟悉 Linq,所以我不会详细介绍发生了什么,因为如果你了解 Linq,它就很容易解释了。

    【讨论】:

    • 有人能告诉我如何将每行打印的字节数限制为 16 个吗?
    • @user3389362 这是一个不同的问题,应该这样提交。我的意思是你应该为此创建一个新问题。
    猜你喜欢
    • 2015-02-14
    • 2014-09-18
    • 2019-09-04
    • 2015-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-17
    相关资源
    最近更新 更多