我有一个十六进制值,例如以下八位字节:82 A9 43
我需要删除所有这些中的8位并将它们连接在一起。
例如:如果我们将每个更改为二进制:
82 = 10000010
A9 = 10101001
43 = 01000011
现在我需要使用以下代码删除上述所有内容的MSB:
int t = 0x7F;
int hv1 = 0x82;
int hv2 = 0xA9;
int hv3 = 0x43;
int r1 = hv1 & t;
int r2 = hv2 & t;
int r3 = hv3 & t;
在上述程序之后,它看起来像:
r1 = 10
r2 = 101001
r3 = 100011
但我需要如下:
r1 = 0000010
r2 = 0101001
r3 = 0100011
原因是后来我想连接所有的r1 | r2 | r3如下:
000001001010010100011
然后应将上述内容转换为整数。
您是否有线索,如何做到这一点。谢谢你的帮助。
答案 0 :(得分:1)
二进制值的前导0并没有真正做任何事情,所以你可以只计算字符并将0添加回它们的前面,然后将它们连接在一起
string PadLeft (string s) {
return string.Format("({0,8})", s)
}
答案 1 :(得分:1)
目前尚不清楚如何将整数值转换为二进制字符串,但我想你正在做这样的事情:
string binaryR1 = Convert.ToString(r1, 2);//binaryR1 = "10"
然后您可以使用PadLeft()
函数填充字符串:
binaryR1 = binaryR1.PadLeft(7, '0');//binaryR1 = "0000010"
或单行:
string binaryR1 = Convert.ToString(r1, 2).PadLeft(7, '0');//binaryR1 = "0000010"
注意:由于您不需要MSB
,这些值已填充为7位数将此应用于所有3个值将允许您连接到完整的字符串:
string full = binaryR1 + binaryR2 + binaryR3;//full = "000001001010010100011"
答案 2 :(得分:0)
没有必要转换为字符串然后返回整数,只需像这样进行整数数学运算:
int concat = r1 << 16 | r2 << 8 | r3;
或更简要地说:
int ttt = 0x7f7f7f;
int concat = (hv1 << 16 | hv2 << 8 | hv3 & ttt;
答案 3 :(得分:0)
在数值上,前导零是无关紧要的。让函数返回数字的字符串表示形式,以便将其填充为8个字符。
答案 4 :(得分:0)
如果你想要它们就像你所描述的那样,只需将前面的零点添加到前面,它就不会改变二进制值
private static string AddZeros(string r)
{
while (r.Length < 8)
r = "0" + r;
return r;
}
答案 5 :(得分:-1)
尝试这样的事情:
int r1 = hv1 & 0x7F;
int r2 = hv2 & 0x7F;
int r3 = hv3 & 0x7F;
int res = ( r1 << 14 ) | ( r2 << 7 ) | r3;
那应该剥离每个字节的第8位,然后将每个字节的0-7位连接成21位数字:
111111122222223333333 // where 1 are bits from r1, 2 from r2 and so on
这就是你想要的吗?