【问题标题】:How to assign a value to a char* using hex notation?如何使用十六进制表示法为 char* 赋值?
【发布时间】:2010-03-10 21:31:51
【问题描述】:

我通常以如下方式使用指针

char *ptr = malloc( sizeof(char) * 100 ); memset(ptr, 0, 100); strncpy(ptr,“猫”,100-1);

但这次我不想使用“cat”,而是使用 ASCII 等价的十六进制。

猫 = 0x63, 0x61, 0x74, 0x00

我试过了

strncpy(点,“0x630x61”,100 - 1);

但它按预期失败了。

正确的语法是什么?

我也需要输入 0x00 吗?暂时忘记memset,现在我需要输入0x00 吗?因为在“cat”表示法中,会自动放置一个空值。

问候

【问题讨论】:

  • 这个的实际用途是什么?这是中等兴趣和中等这可以帮助驱动一个更好的答案......
  • 这与某些 UNICODE 字符有关吗?你为什么要这样做?
  • @Romain 这个问题一直被问到(但很难搜索)——我怀疑提问者有严重的误解
  • 问。你为什么想做这个? A- 我需要制作一些带有十六进制代码的 char* 来与设备通信。这些六进制组合实际上是该设备的命令。这就是我寻找语法的原因。
  • @andrew-dufresne 另外,在英语中,它是“hex”或“hexadecimal”,而不是“hexa”。

标签: c


【解决方案1】:

\xXX 是以十六进制格式插入字符的语法。所以你的会是:

strncpy( ptr, "\x63\x61\x74", 100 - 1);

您不需要输入\x00,因为引号会自动对字符串进行空分隔。

【讨论】:

    【解决方案2】:

    注意,你只需要在 " " 字符串中使用 \

    char cat[4];
    cat[0] = 0x63;
    cat[1] = 0x61;
    cat[2] = 0x74;
    car[3] = 0x00;
    
    char cat[] = "\x63\x61\x74"; // note the \0 is added for you
    
    char cat[] = { 0x63, 0x61, 0x74, 0x00 };
    

    都一样

    【讨论】:

    • 我喜欢你展示三个选项的方式,但是“\0x63\0x61\0x74”是错误的。它创建一个包含字符0, 'x', '6', '3', 0, ... 的数组。当用作以 nul 结尾的字符串时,它的长度为零。
    • 虽然生成的可执行文件具有相同的行为,但它们完全相同:0x63 是一个int 文字,将被转换为char。一些编译器会为此发出“截断”警告。 char cat[] = { '\x63', '\x61', '\x74', '\x00' }; 将与 char cat[] = "\x63\x61\x74"; 相同,并且不会生成编译器警告。
    • 当心! cat[0] = 0xAA 会给你一个从 'int' 到 'char' 的转换溢出,cat[] = { 0xAA } 根本不起作用,你会得到一个缩小转换的错误。因此,您应该删除它不是的“都一样”。检查:coliru.stacked-crooked.com/a/1809f688901d0434
    【解决方案3】:
    strncpy( ptr, "\x63\x61" , 100 - 1 );
    

    0x63 是一个整数十六进制文字; C 编译器在代码中对其进行解析。但在字符串中,它被解释为字符序列0,x,6,3char 的文字,值为 63 hex。是'\x63',在字符串中你必须使用这个符号。 "c\x63"零终止 字符串的文字,与引号中的字符(或表示它们的符号)无关,所以不,您不需要附加手动尾随零。

    【讨论】:

      猜你喜欢
      • 2011-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-31
      • 2012-07-23
      • 2014-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多