为什么字符串转整数函数(例如 strtol()、atoi()、sscanf())在给定十六进制值数组时不断返回 0?

问题描述 投票:0回答:1

问题:

我正在制作一个需要读取/写入十六进制值的文件解释程序。有时,有一段十六进制需要读取为一个长十六进制值,而不是两个不同的十六进制值。 (例如 {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”

arrays c string integer hex
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。

这些函数需要字符串并且您的数据不是字符串。你不能使用它们。

© www.soinside.com 2019 - 2024. All rights reserved.