这是我用来获得这个字符串表示的方法:
public static string ByteArrayToString(byte[] ba, string prefix)
{
StringBuilder hex = new StringBuilder(ba.Length * 2);
foreach (byte b in ba)
{
if (prefix != null)
{
hex.Append(prefix);
}
hex.AppendFormat("{0:x2}", b);
}
return hex.ToString();
}
下面是一个字节数组(ByteArrayToString(arr, "\x")
)的字符串表示示例:
x00x00x00x80xcax26xffx56xbfxbfx49x5bx94xedx94x6exbbx7axd0x9d
xa0x72xe5xd2x96x31x85x41x78x1cxc9x95xafx79x62xc4xc2x8exa9xaf
x08x22xdex22x48x65xdax1dxcax12x99x42xb3x56xa7x99xcax27x7bx2b
x45x77x14x5bxe1x75x04x3dxdbx68x45x46x72x61x20xa9xa2xd9x50xd0
x63x9bx4ex7bxa4xa4x48xd7xa9x01xd1x8ax69x78x6cx79xa8x84x39x42
x32xb3xb1x1fx04x4dx06xcax2cxd5xa0x45x8dx10x44xd5x73xdfx89x0c
x25x1dxcfxfcxb8x07x6bx1fxfaxaex67xf9x00x00x00x03x01x00x01
这是我想要的表示(这是Python的,忽略不同的换行符位置,这都在一行上):
x00x00x00x80xca&xffVxbfxbfI[x94xedx94nxbbzxd0x9dxa0rxe5xd2x961
x85Axx1cxc9x95xafybxc4xc2x8exa9xafx08"xde"Hexdax1dxcax12x99Bxb
3Vxa7x99xca'{+Ewx14[xe1ux04=xdbhEFra xa9xa2xd9Pxd0cx9bN{xa4xa4Hx
d7xa9x01xd1x8aixlyxa8x849B2xb3xb1x1fx04Mx06xca,xd5xa0Ex8dx10Dxd
5sxdfx89x0c%x1dxcfxfcxb8x07kx1fxfaxaegxf9x00x00x00x03x01x00x0
1
Python表示似乎将(十进制)32和126之间的字节转换为它们的ASCII表示,而不是统一转义所有字节。我如何让c#版本产生相同的字符串输出?我依赖于这个字符串输出的散列,所以它们需要完全相同。
如果您确定编码的逻辑,那么您可以直接实现它:
foreach (byte b in ba)
{
if (b >= 32 && b <= 126)
{
hex.Append((char) b);
continue;
}
...
如果您正在寻找性能,您应该查看这个答案,并可能对其中列出的方法之一进行一些调整。