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

mrs*_*rsj 4 c endianness converters

我的任务是使用C将数据文件从big endian转换为little endian,反之亦然。反之,我已经在网上寻找了大约3个小时的其他示例并阅读了我的教科书,但是我对如何开始这一工作非常执着功能。

到目前为止,我的事件顺序是正确的(1到4),但是在convert_and_save函数内部我是否必须使用创建一个char数组?char buffer[4];

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

我需要写一个函数:

void convert_and_save(struct record item, FILE * output_handle, int number);
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

    int characters_to_integer(char * buffer)
    {
       int result;
       memcpy(&result, buffer, 4);
       return result;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  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);
    }
    
    Run Code Online (Sandbox Code Playgroud)

tec*_*rus 5

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

—内置函数:uint16_t __builtin_bswap16(uint16_t x)返回x,其字节顺序相反;例如,0xaabb变为0xbbaa。字节在这里始终意味着8位。

—内置函数:uint32_t __builtin_bswap32(uint32_t x)与__builtin_bswap16类似,不同之处在于参数和返回类型为32位。

—内置函数:uint64_t __builtin_bswap64(uint64_t x)与__builtin_bswap32相似,不同之处在于参数和返回类型为64位。

如果可以使用这些功能,则有可能会为您的平台提供更多最佳代码,否则,请为gcc提交补丁:)

lang也有 __builtin_bswap16() __builtin_bswap32() __builtin_bswap64()

视觉工作室

unsigned short _byteswap_ushort (
   unsigned short val
);
unsigned long _byteswap_ulong (
   unsigned long val
);
unsigned __int64 _byteswap_uint64 (
   unsigned __int64 val
);
Run Code Online (Sandbox Code Playgroud)

ICC _bswap16, _bswap and _bswap64*需要更多参考


小智 -1

您可能想看看这个答案,它展示了如何以不同的字节大小进行两种方式的转换。这是一种方法,但更有效的方法将在线程链接中讨论。

uint32_t num = 9;
uint32_t b0,b1,b2,b3,b4,b5,b6,b7;
uint32_t res = 0;

b0 = (num & 0xf) << 28;
b1 = (num & 0xf0) << 24;
b2 = (num & 0xf00) << 20;
b3 = (num & 0xf000) << 16;
b4 = (num & 0xf0000) << 12;
b5 = (num & 0xf00000) << 8;
b6 = (num & 0xf000000) << 4;
b7 = (num & 0xf0000000) << 4;

res = b0 + b1 + b2 + b3 + b4 + b5 + b6 + b7;

printf("%d\n", res);
Run Code Online (Sandbox Code Playgroud)