c - 如何重新排序整数的字节?

标签 c endianness converters

<分区>

我的任务是使用 C 将数据文件从大端转换为小端,反之亦然。我已经在线查找了大约 3 个小时的其他示例并阅读了我的教科书,但是我对如何甚至启动这个功能。

到目前为止,我的事件顺序是正确的(1 到 4),但在我的 convert_and_save 函数中,我是否必须使用 → char buffer[4];?

有人可以帮帮我吗?即使您只是提供有关查找内容的线索,我也会非常感激。

我需要编写一个函数:

void convert_and_save(struct record item, FILE * output_handle, int number);

在此函数中,我执行以下一系列步骤:

  1. 使用以下方法将整数转换为字符数组:

    int integer_to_characters(int number, char * buffer)
    {
       memcpy(buffer, &number, 4);
    }
    
  2. 反转该数组中字符的顺序。

  3. 使用以下方法将字符数组转换回整数:

    int characters_to_integer(char * buffer)
    {
       int result;
       memcpy(&result, buffer, 4);
       return result;
    }
    
  4. 使用以下方法将转换后的记录写入输出文件:

    void save_record(FILE * file_handle, struct record a)
    {
       char output_buffer[size_of_record];
       integer_to_characters(a.age, &(output_buffer[0]));
       memcpy(&(output_buffer[4]), a.name, 12);
       integer_to_characters(a.department, &(output_buffer[16]));
       fwrite(output_buffer, sizeof(char), size_of_record, file_handle);
    }
    

最佳答案

这些不是标准函数(这些是 gcc 扩展),但您可以使用它们:

— Built-in Function: uint16_t __builtin_bswap16 (uint16_t x) Returns x with the order of the bytes reversed; for example, 0xaabb becomes 0xbbaa. Byte here always means exactly 8 bits.

— Built-in Function: uint32_t __builtin_bswap32 (uint32_t x) Similar to __builtin_bswap16, except the argument and return types are 32 bit.

— Built-in Function: uint64_t __builtin_bswap64 (uint64_t x) Similar to __builtin_bswap32, except the argument and return types are 64 bit.

如果你可以使用这些,它很可能会为你的平台生成更优化的代码,如果不能,干得好,向 gcc 提交一个补丁 :)

Clang 也有 __builtin_bswap16() __builtin_bswap32() __builtin_bswap64()

Visual Studio

unsigned short _byteswap_ushort (
   unsigned short val
);
unsigned long _byteswap_ulong (
   unsigned long val
);
unsigned __int64 _byteswap_uint64 (
   unsigned __int64 val
);

ICC 有 _bswap16、_bswap 和 _bswap64 *需要进一步引用

关于c - 如何重新排序整数的字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24856846/

相关文章:

c - 为什么内核在发送一定数量的字节后会强制从客户端强制发送TCP RST?

python - Python 包 ("<I"的 C 等效项是什么,0)

python - ctypes bigendianstruct Littlendianstruct 对单字节返回不同的结果

c 宏,数组定义作为参数

c - 取消引用结构体中的数组(在 C 中)

c++ - 如何调用 C DLL 函数 C++/CLI

endianness - 如何更改 cortex m3 中的字节序设置?

java - JSF ajax 和自定义转换器

c++ - 数字系统转换器不适用于特定编译器 (Dev-C++)

java - 使用 OpenCSV 将 CSV 文件转换为 XML(使用输入中的字节数组)