0

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

然后应该将上面的内容转换为整数。

你有一个线索,怎么能做到这一点。谢谢您的帮助。

4

6 回答 6

1

二进制值的前导 0 并没有真正做任何事情,因此您只需计算字符并将 0 添加到它们的前面,然后将它们连接在一起

string PadLeft (string s) {
   return string.Format("({0,8})", s)
}
于 2013-06-28T15:32:00.523 回答
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"

注意:这些值已填充为 7 位,因为您不需要 MSB

将其应用于所有 3 个值将允许您连接到完整的字符串:

string full = binaryR1 + binaryR2 + binaryR3;//full = "000001001010010100011"
于 2013-06-28T15:46:19.843 回答
0

无需转换为字符串然后再转换回整数,只需像这样进行整数数学运算:

int concat = r1 << 16 | r2 << 8 | r3;

或更简单地说:

int ttt = 0x7f7f7f; 
int concat = (hv1 << 16 | hv2 << 8 | hv3 & ttt;
于 2013-06-28T15:33:57.517 回答
0

在数值上,前导零是无关紧要的。让您的函数返回数字的字符串表示形式,以便您可以将其填充为 8 个字符。

于 2013-06-28T15:34:22.837 回答
0

如果你想要它们,就像你描述的那样,只需在前面加上一些零,它不会改变二进制值

private static string AddZeros(string r)
    {
        while (r.Length < 8)
            r = "0" + r;

        return r;
    }
于 2013-06-28T15:34:54.017 回答
-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

那是你想要的吗?

于 2013-06-28T16:12:36.877 回答