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)
在此函数中,我执行以下一系列步骤:
使用以下方法将整数转换为字符数组:
int integer_to_characters(int number, char * buffer)
{
memcpy(buffer, &number, 4);
}
Run Code Online (Sandbox Code Playgroud)反转该数组中字符的顺序。
使用以下方法将字符数组转换回整数:
int characters_to_integer(char * buffer)
{
int result;
memcpy(&result, buffer, 4);
return result;
}
Run Code Online (Sandbox Code Playgroud)使用以下命令将转换后的记录写入输出文件:
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)这些不是标准功能(这些是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)
| 归档时间: |
|
| 查看次数: |
3683 次 |
| 最近记录: |