我正在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

这台机器没有字节顺序,这并不重要.

推荐答案

预期结果为:

1
00000000 00000000 00000000 00000001

最重要的位在左边.左边是地址最低的字节.这意味着最高(即,较大的)有效位具有lowest地址.这就是大字节序.读一读https://en.wikipedia.org/wiki/Endianness.

如何将字符顺序考虑在内

申请dynamic programming美元.两个步骤:


nmemb * size * 8;

考虑使用limits.h中的CHAR_BITS

memdump(&i, 1, sizeof(int));

如果更改变量类型,请考虑使用sizeof(i)sizeof(*j).

char *s = "za";

请注意,字符顺序对za的顺序没有影响.z始终是第一个(具有最低地址),然后是a,然后是零字节.您可以考虑 Select 性地应用字符顺序转换.

另外,请注意,在Linux上使用最新的glibc,在C23中,我们有printf("%b", 123);个要打印的东西二进制!耶!

C++相关问答推荐

char为16位且Short也为16位的c环境合法吗

segfault在C中使用getline()函数

错误:在.h程序中重新定义 struct

在C中使用强制转换将uint16_t转换为uint8_t [2]是否有效?

将 typewriter LF打印到Windows终端,而不是隐含的CR+LF

C:scanf(%d&q;,...)输入只有一个减号

显式地将值转换为它从函数返回的类型的含义是什么?

是否所有C编译器在将浮点数转换为整型数时都会隐式删除小数?

如何使用_newindex数组我总是得到错误的参数

Boyer Moore算法的简单版本中的未定义行为

为四维数组中的Dim-1和Dim-3重新分配空间

通过对一个大的Malloc内存进行切片来使用Malloc的内存片

从C中的函数返回静态字符串是不是一种糟糕的做法?

宏观;S C调深度

程序如何解释变量中的值

从Raku nativecall调用时精度不同

一元运算符

如何为avr atmega32微控制器构建C代码,通过光电二极管捕获光强度并通过串行通信传输数据

为什么写入关闭管道会返回成功

为什么使用 C 引用这个 char 数组会导致 Stack smasing?