我只需要使用bitwise&提取这些字节。运营商。 0xFF是一个十六进制掩码,用于提取一个字节。对于2个字节,此代码正常工作:
#include <stdio.h>
int main()
{
unsigned int i = 0x7ee;
unsigned char c[2];
c[0] = i & 0xFF;
c[1] = (i>>8) & 0xFF;
printf("c[0] = %x \n", c[0]);
printf("c[1] = %x \n", c[1]);
return 0;
}
输出:
c[0] = ee;
c[1] = 7;
如果4个字节能够正常工作,我该怎么办?
unsigned int i = 0x557e89f3;
unsigned char c[4];
我的代码:
unsigned char c[4];
c[0] = i & 0xFF;
c[1] = (i>>8) & 0xFF;
c[2] = (i>>16) & 0xFF;
c[3] = (i>>24) & 0xFF;
printf("c[0] = %x \n", c[0]);
printf("c[1] = %x \n", c[1]);
printf("c[2] = %x \n", c[2]);
printf("c[3] = %x \n", c[3]);
答案 0 :(得分:9)
foo
答案 1 :(得分:1)
首先。 C标准不保证'unsigned int'是32位长。为了确保它,你应该使用stdint.h头文件中定义的uint32_t类型(C99)。但是,此类型的实施不是强制性的。 其他解决方案是使用'unsigned long',保证至少有32位。所以解决方案应该是:
#include <stdio.h>
int main()
{
unsigned long int i = 0x557e89f3UL;
unsigned char c[4];
c[0] = i & 0xFF;
c[1] = (i>>8) & 0xFF;
c[2] = (i>>16) & 0xFF;
c[3] = (i>>24) & 0xFF;
printf("c[0] = %x \n", c[0]);
printf("c[1] = %x \n", c[1]);
printf("c[2] = %x \n", c[2]);
printf("c[3] = %x \n", c[3]);
return 0;
}
答案 2 :(得分:0)
您可以简单地将int*
投射到char*
。如果您需要单独数组中的字节,请复制它们。
#include <algorithm>
#include <iomanip>
#include <iostream>
using namespace std;
int main() {
unsigned int i = 0x557e89f3;
unsigned char c[4];
copy_n((unsigned char*)&i, 4, c);
cout << hex << (int)c[0] << ' ' << (int)c[1] << ' '
<< (int)c[2] << ' ' << (int)c[3] << endl;
return 0;
}
它在little-endian系统上输出以下内容。在大端系统上,订单将被颠倒。
f3 89 7e 55