【问题标题】:C how to convert between a normal char to unsigned char (uint)? [duplicate]C如何将普通字符转换为无符号字符(uint)? [复制]
【发布时间】:2021-10-17 04:51:44
【问题描述】:

我正在摆弄一个文件中的一组 i2c 地址。 i2c 地址都是无符号字符,看起来像“0x20”或“0x27”。

问题是从文件中读取时,我得到一个字符数组,但我无法弄清楚 如何将 char[] "0x21" 转换为 unsigned char '0x21'。

有没有类似于printf("0x%02x", address[i]); 但在另一个方向起作用的东西?

【问题讨论】:

  • 问:“转换”是什么意思? “char”和“unsigned char”具有完全相同的位 - 不需要“转换”。也许你的意思是cast?示例:printf("0x%02x", (unsigned char)address[i]);
  • 对不起,我的失误。是的,我的意思是投不转换。如果我使用 unsigned char 0x21 初始化 i2c,一切正常,但如果我尝试使用普通 char[] 初始化,则会出现段错误。
  • 目前还不清楚要问什么。它是文本文件还是二进制文件? 确切的文件内容是什么?你读得怎么样?如果这是您想要的,为什么不将它读入unsigned char 的数组中?
  • if i try to initialize with normal char[] it segfaults. - char[] 不是 char ,

标签: c string char


【解决方案1】:

问题基本上是:“如何将字符串解释为无符号字符值?”

C standard library header 具有用于这些类型转换的多个函数,均名为“strto*”。你想要做的最接近的匹配是strtoul(字符串到无符号长)。 unsigned long 可以转换为无符号字符。代码示例:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char str[] = "0x21";

    unsigned char uc = (unsigned char) strtoul(str, NULL, 16);
    printf("%u\n", uc);
}

打印“33”。

【讨论】:

  • 是的,这正是我的问题,我需要它是 0x21 而不是 31:/
  • 你的意思是33? “0x21”和“33”是相同值的两个不同表示。一个是base 16,另一个是base 10。也就是说unsigned char a = 0x21;unsigned char a = 33;的效果完全一样。
  • ...从printf("%u 0x%x\n", uc, uc);可以看出,输出33 0x21
猜你喜欢
  • 2011-05-11
  • 1970-01-01
  • 2013-10-30
  • 2012-04-01
  • 2013-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多