0转换为128

时间:2017-09-18 12:11:08

标签: c linux snmp data-conversion

我正在尝试从主机Linux到目标系统进行SNMP设置。但是,不是正确的值,而是设置了错误的值。经过一番研究,我做了这张桌子:

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

我有两个问题:

  1. 这个问题背后的原因是什么?
  2. 有谁知道如何将这些Linux值转换为C程序中的正确目标值?

2 个答案:

答案 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和许多其他产品也有类似的说明。