我想将29位值拆分为字节?我怎样才能在C中完成这个?
unsigned long value = 0x18FEF512;
我需要像这样的输出val = 0x18,val1 = FE,val2 = F5,val3 = 12.
如何使用bit twidlling进行此操作?
答案 0 :(得分:5)
试试这个:
unsigned long value = 0x18FEF512;
unsigned char values[4];
values[0] = value;
values[1] = value >> 8;
values[2] = value >> 16;
values[3] = value >> 24;
printf("%02X %02X %02X %02X\n",values[0],values[1],values[2],values[3]);
答案 1 :(得分:2)
编辑每个chux注释:这混合了一点C和C ++语法 - 见下文
直接的方法是将您的29位置于long
或unsigned long
并进行位移:
unsigned long value = 0x18FEF512;
unsigned char val0, val1, val2, val3;
val0 = (unsigned char) (value & 0xFF);
value >>= 8;
val1 = (unsigned char) (value & 0xFF);
value >>= 8;
val2 = (unsigned char) (value & 0xFF);
value >>= 8;
val3 = (unsigned char) (value & 0xFF);
如果必须多次执行,那么首先确定字节顺序然后直接加载字节可能很有用。对于字节序:
int i = 1;
char *ix = (char *) &i;
bool bigendian = (*ix == 0);
然后
char *bytes = (char *) &value;
if (bigendian) {
val3 = bytes[0];
val2 = bytes[1];
val1 = bytes[2];
val0 = bytes[3];
}
else {
val0 = bytes[0];
val1 = bytes[1];
val2 = bytes[2];
val3 = bytes[3];
}
修改
上面的混合C ++语法,当C在开始时想要它们并使用不需要的强制转换时,在代码中声明变量
这与真正的C:
相同#include <stdio.h>
int main() {
unsigned long value = 0x18FEF512;
unsigned char val0, val1, val2, val3;
int i = 1;
char *ix = (char *) &i;
char bigendian = (*ix == 0);
char *bytes = (char *) &value;
val0 = value & 0xFF;
value >>= 8;
val1 = value & 0xFF;
value >>= 8;
val2 = value & 0xFF;
value >>= 8;
val3 = value & 0xFF;
printf("Bit shifting : %x %x %x %x\n", val0, val1, val2, val3);
value = 0x18FEF512;
printf("%System is %s endian", bigendian ? "big" : "little");
if (bigendian) {
val3 = bytes[0];
val2 = bytes[1];
val1 = bytes[2];
val0 = bytes[3];
}
else {
val0 = bytes[0];
val1 = bytes[1];
val2 = bytes[2];
val3 = bytes[3];
}
printf("Endian aware byte access : %x %x %x %x\n", val0, val1, val2, val3);
}
答案 2 :(得分:-5)
您实际要问的是如何打印string
- string
- unsigned long
值的代表段,这可以通过多种方式实现。
首先,您需要获取积分的字符串表示形式,查看printf和%X
格式 - 这样可以让您了解需要执行的操作< em>(提示:printf有一个类似的功能,它将结果存储到您自己的字段中,而不是将其打印到stdout)
现在您需要将生成的字符串拆分为多个部分,strtok将完全相同。
使用生成的标记,您现在可以填充新的char
- 数组并最终打印出来。
祝你好运,你现在掌握了必要的知识。
还有一件事:这与&#34; bit twidding&#34;无关。或位移。完全没有。也许有方法可以计算出与弦段相等的积分段,但我非常怀疑任何人都愿意在其背后进行数学计算 - 这基本上是“重新发明轮子”#34;这甚至不能用于教育目的......