c#十六进制值的二进制运算

时间:2013-06-28 15:29:38

标签: c# binary hex

我有一个十六进制值,例如以下八位字节: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

然后应将上述内容转换为整数。

您是否有线索,如何做到这一点。谢谢你的帮助。

6 个答案:

答案 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

这就是你想要的吗?