c#中类似python的字节数组字符串表示

本文关键字:字节数 数组 字符串 表示 字节 python | 更新日期: 2023-09-27 17:54:20

这是我用来获得这个字符串表示的方法:

    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"))的字符串表示示例:

'x00'x00'x00'x80'xca'x26'xff'x56'xbf'xbf'x49'x5b'x94'xed'x94'x6e'xbb'x7a'xd0'x9d
'xa0'x72'xe5'xd2'x96'x31'x85'x41'x78'x1c'xc9'x95'xaf'x79'x62'xc4'xc2'x8e'xa9'xaf
'x08'x22'xde'x22'x48'x65'xda'x1d'xca'x12'x99'x42'xb3'x56'xa7'x99'xca'x27'x7b'x2b
'x45'x77'x14'x5b'xe1'x75'x04'x3d'xdb'x68'x45'x46'x72'x61'x20'xa9'xa2'xd9'x50'xd0
'x63'x9b'x4e'x7b'xa4'xa4'x48'xd7'xa9'x01'xd1'x8a'x69'x78'x6c'x79'xa8'x84'x39'x42
'x32'xb3'xb1'x1f'x04'x4d'x06'xca'x2c'xd5'xa0'x45'x8d'x10'x44'xd5'x73'xdf'x89'x0c
'x25'x1d'xcf'xfc'xb8'x07'x6b'x1f'xfa'xae'x67'xf9'x00'x00'x00'x03'x01'x00'x01

这是我想要的表示(这是Python的,忽略不同的换行符位置,这都在一行上):

'x00'x00'x00'x80'xca&'xffV'xbf'xbfI['x94'xed'x94n'xbbz'xd0'x9d'xa0r'xe5'xd2'x961
'x85Ax'x1c'xc9'x95'xafyb'xc4'xc2'x8e'xa9'xaf'x08"'xde"He'xda'x1d'xca'x12'x99B'xb
3V'xa7'x99'xca''{+Ew'x14['xe1u'x04='xdbhEFra 'xa9'xa2'xd9P'xd0c'x9bN{'xa4'xa4H'x
d7'xa9'x01'xd1'x8aixly'xa8'x849B2'xb3'xb1'x1f'x04M'x06'xca,'xd5'xa0E'x8d'x10D'xd
5s'xdf'x89'x0c%'x1d'xcf'xfc'xb8'x07k'x1f'xfa'xaeg'xf9'x00'x00'x00'x03'x01'x00'x0
1

Python表示似乎将(十进制)32和126之间的字节转换为它们的ASCII表示,而不是统一转义所有字节。我如何让c#版本产生相同的字符串输出?我依赖于这个字符串输出的散列,所以它们需要完全相同。

c#中类似python的字节数组字符串表示

如果您确定编码的逻辑,那么您可以直接实现它:

foreach (byte b in ba)
{
    if (b >= 32 && b <= 126)
    {
        hex.Append((char) b);
        continue;
    }
    ...

如果您正在寻找性能,您应该查看这个答案,并可能对其中列出的方法之一进行一些调整。