如何将 8 字节十六进制枚举值添加到无符号字符指针?

Posted

技术标签:

【中文标题】如何将 8 字节十六进制枚举值添加到无符号字符指针?【英文标题】:How to add a 8 bytes Hex enumeration value to an unsigned char pointer? 【发布时间】:2014-10-22 16:23:02 【问题描述】:

我有这个 8 字节的十六进制枚举:

enum MyEnum

    OPTION_1        = 0x000000;
    OPTION_2        = 0x000001;
;

有什么办法可以将OPTION_1添加到下面的指针(这个指针会包含其他二进制数据):

unsigned char* MyArray; // bytes array

编辑 我为“添加”的不明确表达表示歉意。好吧,如果我有

enum MyEnum

    OPTION_1        = 0x00;
    OPTION_2        = 0x01;
;

那么这个枚举的值是 1 个字节。所以在指针分配内存之后,我可以简单地分配如下:

MyArray[0]=OPTION_1;

但是现在,问题在于 OPTION_1 的大小为 8 个字节,而不是 1 个字节。所以我不能做那个简单的任务。

我应该有分配,但我不知道值:

 MyArray[0]=?; // copy the first byte of OPTION_1
 MyArray[1]=?; // copy the second byte of OPTION_1
 MyArray[2]=?; // ...
 MyArray[3]=?; // ...
 MyArray[4]=?;
 MyArray[5]=?;
 MyArray[6]=?;
 MyArray[7]=?;

非常感谢!

【问题讨论】:

MyEnum 8 字节是什么意思? “添加”是什么意思?表达式MyArray + OPTION2 是完全合法的,但我不知道这是否是你想要的。 enum 通常被编译器视为int(也许它甚至是C语言标准的一部分)。 我进行了编辑。谢谢@KeithThompson OPTION_1 这样的枚举常量是int 类型,最常见的是4 个字节,而不是8 个。是否有一些sizeof ... 表达式为您生成了8 的值? OPTION_1 是一个值,而不是一个对象;它的第一个,第二个,...字节是什么意思? (对于值为0x01 的8 位整数,通常第一个或最后一个字节的值为1,具体取决于系统是小端还是大端)。你的问题还不清楚。 也许您想要的是 uint64_t foo = OPTION_1; 之类的东西(这会将 OPTION_1 的值转换为 8 字节类型 uint64_t),然后您想要将foo 的字节复制到MyArray? 【参考方案1】:

您必须更具体地说明“将 OPTION_1 添加到以下指针”的含义。添加到指针可能意味着:

    增加指针的地址

    MyArray += OPTION_1; // 这会将指针的地址移动 OPTION_1

    递增指针指向的内存地址中的值(即取消引用指针并递增)

    *MyArray += OPTION_1; // 这将尝试将 OPTION_1 添加到地址处的值

如果您指的是第二个,那么您会遇到一些麻烦,因为您的指针以 8 位(无符号字符)的增量引用内存,并且您的 OPTION_1 被定义为 32 位整数(尽管只有使用前 24 个)。

如果您想将OPTION_1 的各个字节添加到MyArray 指向的地址的前3 个字节,您可以这样做:

  *MyArray = (unsigned char)((OPTION_1 >> 16) & 0xFF);
  *(MyArray+1) = (unsigned char)(OPTION_1 >> 8) & 0xFF;
  *(MyArray+2) = (unsigned char)(OPTION_1 & 0xFF);

当然,您必须小心确保 MyArray 指向的位置至少有 3 个字节可供您操作。

【讨论】:

您好!我为不明确的表达感到抱歉。我已经进行了编辑,我认为您的最后一个建议是有效的,除了我需要将所有 8 个字节复制到已分配内存的指针中。

以上是关于如何将 8 字节十六进制枚举值添加到无符号字符指针?的主要内容,如果未能解决你的问题,请参考以下文章

C ++十六进制字符串到无符号整数[重复]

将结构添加到字节向量,然后添加另一个[关闭]

如何根据十六进制值测试字节?

从有符号/无符号字符到无符号/有符号整数类型转换的 IA32 汇编代码

字符到无符号字符

Xcode(Cocoa)如何将字节写入 NSData