[英]how do i split an unsigned 64 bit int into individual 8 bits? (little endian) in C
[英]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.