【问题标题】:Hex char to int conversion十六进制字符到整数转换
【发布时间】:2014-11-10 08:27:56
【问题描述】:

我正在逐字节地从 UART 读取数据。这被保存到一个字符。 起始字节后面的字节给出了随后传入的字节数(作为十六进制)。我需要将此十六进制数转换为整数,以保持需要读取的字节数。

目前我只是将类型转换为 int。这是我的代码:

char ch;
int bytes_to_read;
while(1){
    serial_read(UART_RX, &ch, sizeof(char));
    if(/*2nd byte*/){
        bytes_to_read = (int)ch;
    }
}

我阅读了有关 strtol() 的信息,但它需要 char 数组作为输入。这样做的正确方法是什么?

【问题讨论】:

  • 你能举个例子吗?字节中的十六进制数是如何编码的?
  • “作为十六进制”是否意味着它以十六进制表示的文本形式出现?我问是因为这里的许多人似乎在说“二进制”时说“十六进制”,即作为原始字节。
  • 你要转换哪个十六进制数?说清楚
  • @user3490458:在这种情况下,您的代码已经在做正确的事情,即将char 转换为int - 那么实际问题是什么?
  • @user3490458 你得到这个0x03真的是4个字符0x03还是一个字节的表示 0x03 和值 3?确保你清楚价值和代表的区别。

标签: c linux serial-port


【解决方案1】:

您的问题不清楚,但假设ch 是一个表示字节数的十六进制字符,那么您可以使用一个简单的函数将十六进制转换为整数,例如

int hex2int(char ch)
{
    if (ch >= '0' && ch <= '9')
        return ch - '0';
    if (ch >= 'A' && ch <= 'F')
        return ch - 'A' + 10;
    if (ch >= 'a' && ch <= 'f')
        return ch - 'a' + 10;
    return -1;
}

然后:

bytes_to_read = hex2int(ch);


但是请注意,如果 ch 真的只是一个原始值(即不是十六进制字符),那么您现有的方法应该没问题:
bytes_to_read = (int)ch;

【讨论】:

  • 为什么不直接使用atoi()
  • @codemonkey:两个主要原因:(i)atoi 使用字符串,而不是单个 chars 和(ii)atoi 使用十进制(以 10 为底)数字,而不是十六进制(基数 16)。
【解决方案2】:

strtol 作用于字符串,chchar,因此将 this 字符转换为有效字符串

char str[2] = {0};
char chr = 'a';

str[0] = chr;

并使用strtol 和基础16

long num = strtol(str, NULL, 16);

printf("%ld\n", num);

【讨论】:

  • 在处理单个字符时使用整个字符数组有点矫枉过正。
  • @user3932000 什么矫枉过正? 2 字节数组在堆栈上,不涉及动态内存,也没有执行昂贵的任务,请修改您对什么是矫枉过正的概念。
  • 这个概念本身就是多余的 imo——将一个 char 转换为一个长度为 1 的字符串,在其上调用一个库函数,然后转换为一个 int ......当一个简单的 if-then 函数就可以了。
【解决方案3】:

我认为简单的方法:

unsigned char x = 0xff;
    int y = (int) x; 
    printf("Hex: %X, Decimal: %d\n",x,x);
    printf("y = %d",y);

更多信息: https://www.includehelp.com/c/working-with-hexadecimal-values-in-c-programming-language.aspx

【讨论】:

    猜你喜欢
    • 2017-08-12
    • 2015-11-29
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    • 2010-10-16
    相关资源
    最近更新 更多