我刚刚学习C#。我有以下两种打印字节数组内容的方法。但我不知道如何将每行的字节数限制为16:
foreach (byte i in buffer)
{
Console.Write("{0:X2} ", i);
}
Console.WriteLine("\n");
Console.WriteLine(string.Join(" ", buffer.Select(b => b.ToString("X2"))));
我可以使用上述任何一种方法来完成这项工作。有人可以给我一个方法或其他方法的建议。
答案 0 :(得分:3)
这个怎么样?
for(int i = 0; i < buffer.Length; i++)
{
Console.Write("{0:X2} ", buffer[i]);
if((i + 1) % 16 == 0) {
Console.WriteLine();
}
}
答案 1 :(得分:2)
您可以使用Take()扩展方法从字节数组中取出最多16个字节。
using System.Linq;
foreach (byte i in buffer.Take(16))
{
Console.Write("{0:X2} ", i);
}
传统的方法是使用for循环,例如
int take = Math.Min(buffer.Length, 16);
for (int i = 0; i < take; i++)
{
Console.Write("{0:X2} ", buffer[i]);
}
<强>更新强>
如果要编写所有缓冲区,但每行只有16个字节(最多),请使用MoreLinq Batch()方法。
using MoreLinq; // Install via NuGet
foreach (byte[] line in buffer.Batch(16))
{
foreach (byte i in line)
Console.WriteLine("{0:X2} ", i);
Console.WriteLine();
}
答案 2 :(得分:1)
使用for循环可以采取16步:
for (int i = 0; i < bytes.Length; i += 16)
{
Console.WriteLine(BitConverter.ToString(bytes, i, Math.Min(16, bytes.Length - i)));
}
如果需要单独打印每个字节,请使用正常步长为1的内循环。
答案 3 :(得分:0)
这是另一种方法:
var counter = 0;
var capacity = 16;
var str = string.Concat(buffer.Select(s =>
{
counter++;
var temp = string.Format("{0:X2}", s);
if (counter < buffer.Length)
{
temp += ", ";
}
if (counter % capacity == 0)
{
temp += "\n";
}
return temp;
}));
Console.WriteLine(str);