问题:
我正在制作一个需要读取/写入十六进制值的文件解释程序。有时,有一段十六进制需要读取为一个长十六进制值,而不是两个不同的十六进制值。 (例如 {0x00, 0x01} == 0x0001 或只是 1)。我能够很好地将这些值放入数组中,这就是为什么我今晚睡觉时会想到“memcmp()”和“memcpy()”。当我需要将十六进制数组转换为我可以使用的一个 int 值时,就会出现问题。每次我使用 string-to-int 函数,比如 atoi(),它总是返回 0。
代码
#include <stdio.h>
#include <string.h>
int main() {
signed char data[] = {0x00, 0x01};
signed char res;
res = strtol((char *)data, NULL, 16);
printf("RES: %d", res);
return 0;
}
我使用
signed char
作为数据类型的原因是因为我想节省内存,而不需要将所有数据存储为 long
之类的东西,而且还因为我设置为 signed char
的值永远不会上升超过 100。
我尝试过的: 我尝试了许多不同的方法来让它发挥作用,比如使用不同的函数和不同的数据类型,但最终,我得到的只是 0。
阿托伊:
...
char data[] = {0x00, 0x01};
int res = atoi(data);
printf("VALUE: %d", res);
...
或sscanf:
...
char data[] = {0x00, 0x01};
int res;
sscanf(data, "%d", &res); // Also tried "%02x" but to no avail.
printf("VALUE: %d", res);
...
预期:
printf()
应打印出“VALUE: 1”
结果:' 打印出“值:0”
{0x00, 0x01} == 0x0001
表示您从某处收到的二进制表示形式是大尾数
要将其作为有符号整数,您需要使用按位运算。
int16_t toInt2Bytes(void *buff)
{
unsigned char *uc = buff;
return (uint16_t)uc[1] | ((uint16_t)(uc[0]) << 8);
}
int main(void)
{
char arr[] = {0x00, 0x01};
char arr1[] = {0x80, 0x00};
printf("%d\n", toInt2Bytes(arr));
printf("%d\n", toInt2Bytes(arr1));
}
https://godbolt.org/z/aMGnrxosv
每次我使用 string-to-int 函数,比如 atoi(),它总是会 返回 0。
这些函数需要字符串并且您的数据不是字符串。你不能使用它们。