我有一些char数组:char char[8]
其中包含两个int,前4个索引是第一个int,接下来的4个索引有第二个int.
char array[8] = {0,0,0,1,0,0,0,1};
int a = array[0-3]; // =1;
int b = array[4-8]; // =1;
Run Code Online (Sandbox Code Playgroud)
如何将此数组转换为两个int?
可以有任何其他类型,不一定是int,但这只是一些例子:
我知道我可以将这个数组复制到两个char数组,其大小为4,然后将每个数组转换为int.但我觉得这不好,打破了干净代码的原则.
如果您的数据具有正确的字节顺序,则可以从字节缓冲区中提取可滑动类型memcpy
:
int8_t array[8] = {0,0,0,1,0,0,0,1};
int32_t a, b;
memcpy(&a, array + 0, sizeof a);
memcpy(&b, array + 4, sizeof b);
Run Code Online (Sandbox Code Playgroud)
虽然@Vivek是正确的,ntohl
可以用来规范化字节序,但你必须这样做是第二步.不要使用指针来玩游戏,因为它违反了严格的别名并导致未定义的行为(实际上,对齐异常或优化器将大部分代码丢弃为无法访问).
int8_t array[8] = {0,0,0,1,0,0,0,1};
int32_t tmp;
memcpy(&tmp, array + 0, sizeof tmp);
int a = ntohl(tmp);
memcpy(&tmp, array + 4, sizeof tmp);
int b = ntohl(tmp);
Run Code Online (Sandbox Code Playgroud)
请注意,几乎所有优化编译器都足够智能,当他们看到memcpy
一个小的常量计数参数时,不会调用函数.
归档时间: |
|
查看次数: |
84 次 |
最近记录: |