【问题标题】:BitArray(16) to HexStringBitArray(16) 到 HexString
【发布时间】:2016-10-29 15:19:23
【问题描述】:

我正在尝试将 BitArray 转换为十六进制字符串

我的测试 BitArray 是“0000001010000000”,它应该以十六进制返回“02 80”

尝试了以下方法:

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

然后,通过检查我创建的 BitArray 对象,得到与该二进制字符串对应的 640 十进制值。

但我找不到将其转换为十六进制的方法。

我避免使用不同类的字节数组。

这行得通,但它有点复杂我确信必须有一个更简单的方法,我不明白为什么我必须切换值。

byte[] bytes = new byte[2];
b.CopyTo(bytes, 0);
string Retorno = BitConverter.ToString(bytes);
string[] auxstr = Retorno.Split('-');
Retorno = auxstr[1] + "-" + auxstr[0];

有什么建议吗?

【问题讨论】:

标签: c#


【解决方案1】:

然后,通过检查我创建的 BitArray 对象并得到对应于该二进制字符串的 640 十进制值。

所以你只想创建一个十六进制值的字符串表示?可以这样轻松完成:

int dec = 640;
string s = Convert.ToString(dec, 16);

甚至string s = $"{dec:X}";

对于前导零(如您在问题中所示),最好的方法是

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

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


获取BitArray 的“价值”的一种简单方法是(对于长度

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

【讨论】:

  • 有点,但我确实需要先从 BitArray 中获取该十进制数
  • @VyacheslavShcherbakov 我的答案的最后一行是否符合您的要求?或者你需要更大的数组吗?
  • 非常感谢
【解决方案2】:

试试这个,

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 来说非常方便。
【解决方案3】:

你的 bitArray 集和字符串表示不一样。

你写的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

如果你想重现 Hex 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

【讨论】:

    猜你喜欢
    • 2018-08-30
    • 2014-01-05
    • 1970-01-01
    • 2012-03-30
    • 2019-04-12
    • 1970-01-01
    • 2011-09-10
    • 2016-08-31
    • 2017-12-19
    相关资源
    最近更新 更多