c - c中的字节顺序独立I/O

标签 c io

我必须从输入中读取 4 个字节的 block (见下文)。

#include <stdio.h>
#include <stdlib.h>
unsigned char input[4][8] = {{'A', 'B','C','D','A','B','C','D'},
        {'A', 'B', 'C', 'D','A', 'B', 'C', 'D'},
        {'A', 'B', 'C', 'D','A', 'B', 'C', 'D'},
        {'A', 'B', 'C', 'D','A', 'B', 'C', 'D'}
};
unsigned char output[4][2];
int main(void) {
    int  line_num;
    unsigned int *ptr=(unsigned int*)&input;
    for (line_num=0; line_num < 4*2; line_num++) {
        unsigned char *arr1 = ( (unsigned char*)ptr );
        printf("==> line_num %d: %c%c%c%c\n", line_num, *arr1, *(arr1+1), *(arr1+2), *(arr1+3));
        ptr++;
    }
    return EXIT_SUCCESS;
}

现在我只是使用一个整数指针来读取 4 个字节,并使用一个 char* 指针在 4 字节 block 内进行迭代;这适用于大端,但不适用于小端。在“C”中是否有更通用且与顺序无关的方法?

最佳答案

首先,不要将 char 缓冲区解释为 unsigned int。您必须将该值复制到有效对象。

为避免字节顺序问题,请确定您将在传输中使用哪种顺序,然后转换将独立于平台。

假设传输中的数据是小端(并且值是合理的)你获得这样的值:(这适用于任何平台)

unsigned char data[4] = ... ;

uint32_t value = (data[0] << 0) | (data[1] << 8) | (data[2] << 16) | (data[3] << 24);

如果是大端,则反之亦然。

关于c - c中的字节顺序独立I/O,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31187379/

相关文章:

Haskell 处理 [IO 字符串]

java - 通过ObjectInputStream接收对象

java - 字符串无法转换为数组

c - 在C中打印UTF-8多字节字符

c - 将结构体传递给函数并循环遍历它

c++ - 将标题添加到大文件的最佳方法是什么

windows - 是否需要 FlushFileBuffers 才能跨多个进程同步文件数据?

c - 在 C 中访问从 Lua 传递的表,而不复制值

c - 如何在我的 minishell 中处理 null 环境变量?

c - C 中的 typedef 和指向函数的指针