繁体   English   中英

我如何将一个无符号的 64 位 int 拆分为单独的 8 位? (小端)在 C

[英]how do i split an unsigned 64 bit int into individual 8 bits? (little endian) in C

例如,我有uint64_t value = 42 ,我想将其拆分为 8 个uint8_t (8 位),小端。 但我不确定如何进行位移。 帮助将不胜感激。

无论字节顺序如何,这都有效:

uint64_t input = 42;
uint8_t values[8];
values[0] = input >> 0 & 0xFF;
values[1] = input >> 8 & 0xFF;
values[2] = input >> 16 & 0xFF;
values[3] = input >> 24 & 0xFF;
values[4] = input >> 32 & 0xFF;
values[5] = input >> 40 & 0xFF;
values[6] = input >> 48 & 0xFF;
values[7] = input >> 56 & 0xFF;

请注意, & 0xFF在这里是多余的,但它使代码更清晰,并且如果您想对该值执行任何操作而不是立即将其分配给uint8_t变量,它会很有用。

#define EXTRACT(u,b) ((u) >> (8 * (b)))

int foo(uint64_t x)
{
    uint8_t b[8] = {
        EXTRACT(x,0),
        EXTRACT(x,1),
        EXTRACT(x,2),
        EXTRACT(x,3),
        EXTRACT(x,4),
        EXTRACT(x,5),
        EXTRACT(x,6),
        EXTRACT(x,7),
        };
}

如果是小端,那么memcpy就足够了:

void foo(uint64_t x)
{
    uint8_t b[8];
    memcpy(b, &x, sizeof(b));
}

如果您想要小端字节序,那么您可以执行以下操作:

为了获得第一个字节,您只需应用 AND 位掩码0xFF 这将屏蔽除 8 个最低有效位之外的所有

为了获得第二个字节,在应用位掩码之前右移 8 位。
为了获得第三个字节,在应用位掩码之前右移 16 位。
为了获得第四个字节,在应用位掩码之前右移 24 位。 (……)
为了获得第八个字节,在应用位掩码之前右移 56 位。

这是代码:

#include <stdio.h>
#include <stdint.h>

int main( void )
{
    uint64_t value = 42;
    uint8_t bytes[8];

    //extract the individual bytes
    for ( int i = 0; i < 8; i++ )
    {
        bytes[i] = value >> (8 * i) & 0xFF;
    }

    //print the individual bytes
    for ( int i = 0; i < 8; i++ )
    {
        printf( "%2d ", bytes[i] );
    }

    printf( "\n" );
}

输出:

42  0  0  0  0  0  0  0 

这是从我通常使用的 u64 数据中检索字节数据的指针方法。 只是与你分享。 但是这样一来,用户就不得不照顾订单了。

  1 #include <stdio.h>
  2 #include <stdint.h>
  3
  4 void main(void)
  5 {
  6     int i;
  7     uint64_t v = 0x123456789abcdef0;
  8     uint8_t* ptrb;
  9
 10     ptrb = (uint8_t*)&v;
 11
 12     for (i = 0; i < 8; i++)
 13     {
 14         printf("%2x ", ptrb[i]);
 15     }
 16
 17     printf("\n");
 18 }

下面是我的示例代码的输出,

$ ./foo
f0 de bc 9a 78 56 34 12

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM