【发布时间】:2022-01-18 18:13:41
【问题描述】:
我正在开发一个需要将任何类型的变量从大端转换为小端的应用程序。
我的系统使用不同的变量类型(16、32 和 64 位宽),我需要能够使用单个函数更改字节顺序。我编写了一个函数,可以设法交换任何变量中的字节,但是我对此并不满意。它可以工作,但它需要取消引用 void 指针,这很容易与双星出现错误......
- 有没有更好的方法来解决这个问题?
- 有什么方法可以避免 void 指针作为返回值?我在考虑 switch-case 循环(例如 case 4 bytes -> return int32)但是,我不知道如何为返回不同值的函数编写函数原型。
我的功能:
void* swapBytes(void* number, int bytes_num){
void* swapped;
unsigned __int8* single_byte_ptr;
swapped = malloc(bytes_num * sizeof(__int8));
for (int i = 0; i<bytes_num; i++){
single_byte_ptr =((unsigned __int8*)number)+i; //get current byte
*( (__int8*)(swapped)+((bytes_num-1)-i)) = (unsigned __int8)*single_byte_ptr; //save the byte in new position
}
return swapped;
}
我调用这个函数的方式
__int64 big_number = 35169804487071;
big_number = *(__int64*)(swapBytes(&big_number, 8));
【问题讨论】:
-
我的系统使用不同的变量类型... - 您的系统如何获取“错误”格式的数据?
-
我正在研究 MPC5748G - 来自 NXP 的微控制器 - 我正在从 CAN 读取数据,CAN 与许多其他设备连接到总线。这些设备使用不同的数据格式。
-
你的代码也会泄露内存。
-
那么最便携的方法是将输入作为字节流并“手动”重新解释(如
word = byte0 + (byte1 << 8) + (byte2 << 16) +... -
对this question的回答有很多建议。