将数据存入整数时会产生错误的数字?

lin*_*eak 1 c parsing buffer pointers memcpy

我有这样的char缓冲区

char *buff = "aaaa0006france";
Run Code Online (Sandbox Code Playgroud)

我想提取字节4到7并将其存储在int中.

int i;
memcpy(&i, buff+4, 4);
printf("%d ", i);
Run Code Online (Sandbox Code Playgroud)

但它会打印垃圾值.

这有什么问题?

tem*_*def 5

字符串

0006
Run Code Online (Sandbox Code Playgroud)

没有与整数6相同的二进制表示.相反,它的位表示为四个ASCII字符,表示字形0,字形0,字形0,然后是字形6.这有十六进制表示

0x30303036
Run Code Online (Sandbox Code Playgroud)

如果您尝试在little-endian系统上盲目地将这些位重新解释为数字,那么您将获得808,464,438.在大端系统上,你得到909,127,728.

如果要将字符串的子字符串转换为数字,则需要查找将字符串转换为数字的函数.您可能想尝试这样的事情:

char digits[5];

/* Copy over the digits in question. */
memcpy(digits, buff + 4, 4);
digits[4] = '\0';  /* Make sure it's null-terminated! */

/* Convert the string to a number. */
int i = strtol(digits + 4, NULL, 10);
Run Code Online (Sandbox Code Playgroud)

这使用strtol函数将文本字符串转换为数字,以将文本显式转换为整数.

希望这可以帮助!