我正在尝试从主机Linux到目标系统进行SNMP设置。但是,不是正确的值,而是设置了错误的值。经过一番研究,我做了这张桌子:
0 - 0x80 - 1000 0000 - 0 is converted to 128
1 - 0x40 - 0100 0000 - 1 is converted to 64
2 0x20 - 0010 0000 - 2 is converted to 32
3 0x10 - 0001 0000 - 3 is converted to 16
4 0x08 - 0000 1000 - 4 is converted to 8
5 0x04 - 0000 0100 - 5 is converted to 4
6 0x02 - 0000 0010 - 6 is converted to 2
7 0x01 - 0000 0001 - is converted to 1
0 - 0x00 - 0000 0000
1 - 0x01 - 0000 0001
2 0x02 - 0000 0010
3 0x03 - 0000 0011
4 0x04 - 0000 0100
5 0x05 - 0000 0101
6 0x06 - 0000 0110
7 0x07 - 0000 0111
我有两个问题:
答案 0 :(得分:3)
如果我正确理解了您的问题,您将收到一个使用单热编码编码8个值(0到7)的字节。请参阅https://en.wikipedia.org/wiki/One-hot(注意:您的位顺序似乎相反)。
如果您只是将一个热门编码的位模式放入目标系统的字节变量中,那么当您的目标系统使用其他编码时,您不会获得原始值(可能是2& #39;补充)。换句话说 - 给定的位模式在单热编码和2的补码编码中具有不同的含义。
因此,任务是将单热编码值转换为目标系统上的等效值。
您可以使用简单的switch语句 - 例如:
int main(void)
{
unsigned char linux_snmp_value = 0x20;
unsigned char target_value = 255;
switch(linux_snmp_value)
{
case 0x80:
target_value = 0;
break;
case 0x40:
target_value = 1;
break;
case 0x20:
target_value = 2;
break;
// Add the remaining cases here
default:
// Illegal value
// Add some error handling
break;
}
printf("Target value %d\n", target_value);
return 0;
}
如果您更喜欢循环,它可能类似于:
int main(void)
{
unsigned char linux_snmp_value = 0x01;
unsigned char target_value = 0;
unsigned char mask = 0x80;
while (mask)
{
if (mask == linux_snmp_value) break;
++target_value;
mask = mask >> 1;
}
if (mask == 0)
{
// Illegal value
// Add some error handling
printf("ERROR\n");
return -1;
}
printf("Target value %d\n", target_value);
return 0;
}
答案 1 :(得分:0)
如果可移植性不是问题(例如你不能在VAX或AVR8机器上编译),你可以使用它的机器指令
asm (“bsrl %1, %0” : “=r” (position) : “r” (number));
你也可以把它包装成漂亮的内联函数。 ARM,MIPS,PIC和许多其他产品也有类似的说明。