代码之家  ›  专栏  ›  技术社区  ›  chb

从十六进制字符数组中获取整数?

c
  •  0
  • chb  · 技术社区  · 7 年前

    static const unsigned char code[] = "\xb0\x2a\xc3";
    int value;
    value = (*(uint8_t(*)())code)();
    

    据我所知,十六进制字符数组(语法上表示为字符指针)被转换为无符号整数。但我不明白的是:

    1. 括号
      尤其是那些在结尾,在结束分号之前,这使它看起来好像 code 数组作为函数调用
      b。 两人紧随其后 uint8_t 包含星号的

    2. 星号
      什么被取消引用,顺序是什么?
      b。 单位8\t

    3. 如何将整个数组转换为不同的类型,而不必对每个元素进行转换?如果 unsigned char 单位8\t 大小不一?
    1 回复  |  直到 7 年前
        1
  •  2
  •   melpomene    7 年前

    十六进制字符数组(语法上表示为字符指针)

    不,“十六进制字符”不是一个东西。而且,这里没有char指针。

    code 是无符号字符(即字节)的数组。此数组有4个元素: 0xb0 0x2a 0xc3 , 0x00 (或等同于: 176 42 , 195 , 0 ).

    uint8_t (*)() uint8_t .

    (*(uint8_t(*)())code)() :

    • 代码 (数组)在表达式中。它不是的操作数 sizeof &

    • 此指针(类型) unsigned char * )至 code[0] 转换为其他类型: 单位(*)() ,即指向返回 单位8\t .

      ( TYPE ) EXPR . 我们有一个 TYPE 属于 int8_t (*)() 我们的 EXPR .

    • * ),产生一个函数。此操作是多余的,因为任何函数值都会立即衰减回指针(除非它是 & ,在这种情况下,您将返回一个函数指针)。

    • 函数指针确实由最后一对paren调用, () .

    这段代码实际上是高度依赖于平台的。在某些平台上,将数据指针转换为函数指针会产生一个“函数”,其代码由数据指定,即,这最终会跳到并执行 代码 作为机器代码。