繁体   English   中英

我正在尝试从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;
}

上面的代码有点笨拙,但我将其作为“单线”解决了。 这是一个函数实现。

#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;
}

暂无
暂无

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

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