如何在C中将29位值拆分为字节?

时间:2014-10-02 20:52:17

标签: c gcc

我想将29位值拆分为字节?我怎样才能在C中完成这个?

unsigned long value = 0x18FEF512;

我需要像这样的输出val = 0x18,val1 = FE,val2 = F5,val3 = 12.

如何使用bit twidlling进行此操作?

3 个答案:

答案 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位置于longunsigned 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;这甚至不能用于教育目的......