我正在try 对该函数进行编码:
void memdump(void *p, size_t nmemb, size_t size);
个
其目的是以正确的顺序显示p
指向的变量中包含的位.不判断p
是否等于NULL
是故意的.也使用write()
.
问题是,无论机器的字节顺序如何,我都希望显示是正确的.
以下是我的代码:
#include <unistd.h>
#include <stdint.h>
void memdump(void *p, size_t nmemb, size_t size)
{
size_t total_bits = nmemb * size * 8;
unsigned char *ptr = (unsigned char *)p;
for (size_t i = 0; i < total_bits; i++) {
unsigned char bit = (ptr[i / 8] >> (7 - (i % 8))) & 0x01;
char c = bit ? '1' : '0';
write(STDOUT_FILENO, &c, sizeof(char));
if ((i + 1) % 8 == 0)
write(STDOUT_FILENO, " ", 1);
}
write(STDOUT_FILENO, "\n", sizeof(char));
}
int main(void)
{
int i = 0;
int j[2] = {1, 0};
char c = 'a';
char *s = "za";
uint64_t size = 213213;
memdump(&i, 1, sizeof(int));
memdump(j, 2, sizeof(int));
memdump(&c, 1, sizeof(char));
memdump(s, 2, sizeof(char));
memdump(&size, 1, sizeof(size_t));
return 0;
}
因此,我预计会有以下结果:
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000000
01100001
01111010 01100001
00000000 00000000 00000000 00000000 00000000 00000011 01000000 11011101
但我明白:
00000000 00000000 00000000 00000000
00000001 00000000 00000000 00000000 00000000 00000000 00000000 00000000
01100001
01111010 01100001
11011101 01000000 00000011 00000000 00000000 00000000 00000000 00000000
你能帮帮我吗?
下面是一个可重复使用的例子的链接:https://onlinegdb.com/4e5Ei2OUS
提前谢谢你
[更新]
我不知道如何考虑字符顺序,这是我的问题. 我的内存转储函数应该具有上面指定的预期行为.
我不判断指针是否为空的原因很简单,因为这个函数是基于标准C库及其原则的库的一部分(即开发人员对他们的代码负责,所以将空字符串传递给strlen(),您不会收到任何警告).
我的函数应该按照字节插入变量Example的顺序显示字节:
int test[2] = {0 , 1};
个
预期结果为:
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001
个
这台机器没有字节顺序,这并不重要.