将位数组(16)转换为十六进制字符串。

3
我想把一个BitArray转换成十六进制字符串。
我的测试BitArray是“0000001010000000”,应该返回“02 80”(有空格)。
尝试了以下方法:
BitArray b = new BitArray(16);
b.Set(7, true);
b.Set(9, true);

然后,通过检查我创建的BitArray对象并获取对应于该二进制字符串的640十进制值。但我找不到将其转换为十六进制的方法。我避免使用Byte Array,这是一个不同的类。这个方法可以工作,但有点复杂,我相信一定有更简单的方法,而且我不明白为什么我必须交换值。
byte[] bytes = new byte[2];
b.CopyTo(bytes, 0);
string Retorno = BitConverter.ToString(bytes);
string[] auxstr = Retorno.Split('-');
Retorno = auxstr[1] + "-" + auxstr[0];

任何建议?

1
看一下这个 SO 帖子:链接 - MX D
你可以像这个问题中那样将它转换为byte[],然后逐个格式化字节。 - Codor
3个回答

1
然后,通过检查我创建的BitArray对象并获取对应于该二进制字符串的640十进制值。所以您只想创建十六进制值的字符串表示形式吗?这可以很容易地完成,如下所示:
int dec = 640;
string s = Convert.ToString(dec, 16);

甚至可以使用string s = $"{dec:X}";来实现。

如果需要前导零(正如您在问题中展示的那样),最好的方法是:

string s = $"{dec:X4}";

请注意,在您的问题中,十六进制的640280而不是您所说的208

获取你的BitArray的“值”的简单方法是(对于长度≤32):

int v = array.OfType<bool>().Select((b, i) => b ? 1 << i : 0).Sum()

有点类似,但我需要先从BitArray中获取那个十进制数。 - Vyacheslav Shcherbakov
@VyacheslavShcherbakov,我回答的最后一行是否符合您的要求?或者您需要处理更大的数组? - René Vogt
非常感谢您。 - Vyacheslav Shcherbakov

0

试试这个,

string binary = "0000001010000000";

StringBuilder hexvalue= new StringBuilder(binary.Length / 8 + 1);           

int Len = binary.Length % 8;
if (Len != 0)
{               
     binary = binary.PadLeft(((binary.Length / 8) + 1) * 8, '0');
}

for (int i = 0; i < binary.Length; i += 8)
{
     string Bits = binary.Substring(i, 8);
     hexvalue.AppendFormat("{0:X2}", Convert.ToByte(Bits , 2));
}

binary =  hexvalue.ToString();          

在调用StringBuilder构造函数时,指定容量的规范是不必要的。此外,对于OP来说,一些关于这个操作的解释可能非常有用。 - Maarten

0

您的位数组设置和字符串表示不同。

您写的是0000001010000000,实际上设置如下:

BitArray b = new BitArray(16);
b.Set(6, true);
b.Set(8, true);

但是你的代码:

BitArray b = new BitArray(16);
b.Set(7, true);
b.Set(9, true);

实际上会生成这组数字:

0000000101000000

如果你想要复制十六进制数0280,那么你应该这样做:

BitArray b = new BitArray(16);
b.Set(6, true);
b.Set(8, true);

var @string = String.Concat(b.Cast<bool>().Select(x=> { return x ? '1' : '0'; }));
var result = Convert.ToInt32(@string, 2).ToString("X4");

其中result将具有此值0280


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