从数组 c 中读取 WORD

Reading WORD from a array c

有没有一种从字符串中解析出 32 位值的好方法?以下函数没有抛出正确的值,我不知道如何修复它。该值应为 170

unsigned int getvalue(const char *data, int offset)
{
  unsigned int payload = 0;
  for (unsigned char i = 0; i < 4; i++)
  {
    payload <<= 8;
    payload |= data[i + offset];
  }
  return payload;
}



int value = 0x00aa; 
unsigned char b1 = (value & 0xFF); 
unsigned char b2 = ((value >> 8) & 0xFF); 
unsigned char b3 = ((value >> 16) & 0xFF); 
unsigned char b4 = ((value >> 24) & 0xFF); 

int number = (b4 << 24) + (b3 << 16) + (b2 << 8) + b1;
printf("value is: %d\n", number); // value is: 170 correct


char payload[] = "000000aa";
int value2 = getvalue(payload, 0);

printf("value is: %dn", value2); // value is: 808464432n Not correct

如果要将包含十六进制数的 C 字符串转换为整数值:

unsigned long long conv(const char *str)
{
    const char digits[] = "01234567890ABCDEF";
    unsigned long long result = 0;
    char *ref;

    while(*str)
    {
        result *= 16;
        ref = strchr(digits, toupper((unsigned char)*str));
        if(ref)
        {
            result += ref - digits;
        }
        else
        {
            /* error handling */
        }
        str++;
    }
    return result
}

C字符串中的数字是表示字母或数字的字符的ASCII表示。 '0' 在 char 数组中不是由零表示,而是 0x30。

将您的 getvalue 更改为

unsigned int getvalue(const char *data, int offset)
{
  unsigned int payload = 0;
  for (unsigned char i = 0; i < 8; i++)
  {
    payload <<= 4;
    if (data[i + offset] >= 'a') {
        payload |= (data[i + offset] - 97) + 10;
    } else if (data[i + offset] >= 'A') {
        payload |= (data[i + offset] - 65) + 10;
    } else {
        payload |= (data[i + offset] - 48);
    }
  }
  return payload;
}

每个十六进制值占4位,因此<< 4 字符串中的每个字符都在其 ASCII 代码中,因此减法。 'a' 的 ASCII 值为 97,但十进制值必须为 10,因此表达式为 'a' - 97 + 10

无需重新发明轮子。有一个库函数可以做到这一点:strtol.

#include <stdlib.h>

unsigned int getvalue(const char *data, int offset)
{
    char *end;
    long payload = strtol(&data[offset],&end,16);
    if (*end  ||  payload < 0  ||  payload > UINT_MAX) {
        /* error handling */
    }
    return (unsigned int)payload;
}