C#中将字节转换为二进制字符串

63
在C#中,我正在将一个byte转换为binary,实际答案是00111111,但给出的结果是111111。现在我真的需要显示前面的2个0。有人能告诉我如何做吗?
我正在使用:
Convert.ToString(byteArray[20],2)

并且字节值为63


使用C++,将包含二进制数据的字符串转换为最有效的方法是什么? - user195488
4个回答

76

只需更改您的代码:

string yourByteString = Convert.ToString(byteArray[20], 2).PadLeft(8, '0');
// produces "00111111"

3
无论如何都会有8个数字,如果您提供了所有数字,PadLeft方法将不起作用,但如果您没有提供所有数字,则会在左侧填充0以填满剩余空间。 - Kelsey
@Iancian 这个问题最终解决了吗? - Kelsey
@Kelsey 这是因为它知道在将字节转换为字符串时,字节始终为8位长度。这就是为什么它总是有效的吗? - johnny
@johnny 不是的,它首先将其转换为字符串(使用, 2表示将其转换为二进制),然后padLeft表示在前面添加“0”,直到字符串的长度为8。 - Dennis van Gils
我知道这不是一个常见的使用案例,但为什么从定义为8位数组的结构中获取比特位会带来很多麻烦呢?这听起来像是应该内置在字节结构中的功能。虽然这种解决方案有效,但就像问别人的名字,那个人需要查看自己的身份证号码,以便他们可以去注册处查询自己的名字一样。 - Francisco Chavez-Tejeda
显示剩余2条评论

31

如果我理解正确,您有20个值需要转换,所以只需要简单地更改您所编写的内容。

将单个字节转换为8个字符的字符串:Convert.ToString(x, 2).PadLeft(8, '0')

要更改整个数组:

byte[] a = new byte[] { 1, 10, 100, 255, 200, 20, 2 };
string[] b = a.Select( x => Convert.ToString( x, 2 ).PadLeft( 8, '0' ) ).ToArray();
// Returns array:
// 00000010
// 00010100
// 11001000
// 11111111
// 01100100
// 00001010
// 00000001

将字节数组转换为单个字符串,其中每个字节用空格分隔:

byte[] a = new byte[] { 1, 10, 100, 255, 200, 20, 2 };
string s = string.Join( " ",
    a.Select( x => Convert.ToString( x, 2 ).PadLeft( 8, '0' ) ) );
// Returns: 00000001 00001010 01100100 11111111 11001000 00010100 00000010

如果字节的顺序不正确,请使用 IEnumerable.Reverse()

byte[] a = new byte[] { 1, 10, 100, 255, 200, 20, 2 };
string s = string.Join( " ",
    a.Reverse().Select( x => Convert.ToString( x, 2 ).PadLeft( 8, '0' ) ) );
// Returns: 00000010 00010100 11001000 11111111 01100100 00001010 00000001

4
public static string ByteArrayToString(byte[] ba)
{
    StringBuilder hex = new StringBuilder(ba.Length * 2);
    foreach (byte b in ba)
        hex.AppendFormat("{0:x2}", b);
    return hex.ToString();
}

这段代码的输出如下: 55 4d 04 a8 4f 2a cd 01 40 00 81 57 4d 32 36 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 0f 00 00 00 00 00 00 02 0f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 06 a5 - Dr. Failov

2
尝试这个:

试一试:

public static String convert(byte b)
{
    StringBuilder str = new StringBuilder(8);
            int[] bl  = new int[8];

    for (int i = 0; i < bl.Length; i++)
    {               
        bl[bl.Length - 1 - i] = ((b & (1 << i)) != 0) ? 1 : 0;
    }

    foreach ( int num in bl) str.Append(num);

    return str.ToString();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接