在c#中将数组打印为十六进制值

时间:2015-10-29 00:26:32

标签: c# arrays

我想将数组打印为十六进制。在下面的代码'缓冲区'由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个字节,那么我也会很感激这些信息。

2 个答案:

答案 0 :(得分:5)

您应该首先在每个字节上应用var str = string.Concat(buffer.Select(i => string.Format("{0:X2}, ", i))) Console.WriteLine(str);

ToString("X2")

答案 1 :(得分:2)

因为在进行foreach循环时,您将一个字节传递给格式化的Console.WriteLine()。但是,您在另一个实例中传递整个连接缓冲区的字符串,因为in_group(user.id,4)&&manages(self.id,user.id)返回一个字符串。

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

虽然第一个没有给出一个尾随逗号,所以我会在第二个方法上使用它。但是我想我会分享不同的方法来实现它。

希望你对Linq很熟悉,所以我不会详细了解正在发生的事情,因为如果你理解Linq,这是非常明显的。