我正在尝试从 little endian 中的结构中的值读取所有 64 位

I am trying to read all 64 bits from a value inside a struct in little endian

我正在尝试读取存储在 struct.value 中的 64 位值。我想打印小端的值和带有尾随 0 的完整 64 位值。有没有办法用 printf 做这个?

struct sample{
uint8_t other values;
uint8_t other values;
uint8_t other values;
uint64_t value  //Not the full struct, just sample code
}sample_t

reader(sample_t sample)
{
 sample.value = 0x1234;
 // I would like to print "3412000000000000"
}

注意:这只是为了获得一般概念的示例代码,而不是实际代码。我希望这是足够的信息来传达我正在寻找的东西。提前致谢!

大概是这样的:

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

int main(void){
    uint64_t n = 0x1234;
    printf("%02X%02X%02X%02X%02X%02X%02X%02X\n", 
            (unsigned)(n & 255), 
            (unsigned)((n >> 8) & 255), 
            (unsigned)((n >> 16) & 255), 
            (unsigned)((n >> 24) & 255), 
            (unsigned)((n >> 32) & 255), 
            (unsigned)((n >> 40) & 255), 
            (unsigned)((n >> 48) & 255), 
            (unsigned)((n >> 56) & 255) );
    return 0;
}

上面的有点笨拙,但我解决了它作为"one-liner"。这是一个函数实现。

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

int rev_print64(uint64_t n)
{
    int i;
    int res;
    for (i = 0; i < 8; i++) {
        res = printf("%02X", (unsigned)(n & 255));
        if(res != 2)
            return res;
        n >>= 8;
    }
    return 16;
}

int main(void){
    rev_print64(0x1234);
    printf("\n");
    return 0;
}

程序输出

3412000000000000

printf 无法为您做到这一点。你将不得不自己做。

#include <stdio.h>
#include <inttypes.h>

uint64_t mirror(uint64_t value) {
    uint64_t temp, mask = 0xFF;
    int i;
    for (i = 0; i < 8; ++i) {
        temp = (temp << 8) | (value & mask) >> 8 * i;
        mask <<= 8;
    }
    return temp;
}

int main() {
    uint64_t value = 0x1234;

    printf("%llx\n", value);             // Outputs 1234
    printf("%016llx\n", mirror(value));  // Outputs 3412000000000000

    return 0;
}

可能的解决方案之一:

#include <stdio.h>
#include <inttypes.h>

int main(void) {
    uint64_t value, value_to_print;
    uint8_t *ptr_s = (uint8_t *)&value_to_print;
    uint8_t *ptr_e = ptr_s + sizeof(value_to_print) - 1;
    value = 0x1234;

    // swap the bytes. tidbit: no helper variable used!
    value_to_print = value;
    while (ptr_s < ptr_e) {
        *ptr_s ^= *ptr_e;
        *ptr_e ^= *ptr_s;
        *ptr_s ^= *ptr_e;
        ++ptr_s;
        --ptr_e;
    }
    printf("%016"PRIx64"\n", value_to_print);

    return 0;
}