我正在開發一個需要將任何型別的變數從大端轉換為小端的應用程式。
我的系統使用不同的變數型別(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));
uj5u.com熱心網友回復:
您遇到的一個問題是您正在泄漏記憶體。您回傳一個指向 malloc 記憶體的指標,但回傳時并未保存該指標。
鑒于您將結果分配回相同的值,最好更新現有變數,將當前位元組與“相反”端的位元組交換。
您也不需要使用void *引數型別以外的任何地方。在函式內部,只需使用指向unsigned char或的指標unsigned __int8來處理位元組。
void swapBytes(void* number, int bytes_num)
{
unsigned __int8* ptr = number;
for (int i = 0; i<bytes_num/2; i ) {
unsigned __int8 tmp = ptr[i];
ptr[i] = ptr[bytes_num-1-i];
ptr[bytes_num-1-i] = tmp;
}
}
然后像這樣呼叫它:
swapBytes(&big_number, sizeof(big_number));
uj5u.com熱心網友回復:
您的解決方案設計過度,而且完全不適合 MPC57xx 等嵌入式系統。
使用指向字符的指標可以安全地迭代任何整數型別。假設uint8_t*是編譯器的字符型別,就這么簡單:
void little_to_big16 (uint8_t big [sizeof(uint16_t)],
const uint8_t little [sizeof(uint16_t)])
{
big[0] = little[1];
big[1] = little[0];
}
然后根據需要寫big_to_little16,big_to_little32等等。這些函式也可以而且應該被行內。
使用示例:
#include <stdio.h>
#include <inttypes.h>
void little_to_big16 (uint8_t big [sizeof(uint16_t)],
const uint8_t little [sizeof(uint16_t)])
{
big[0] = little[1];
big[1] = little[0];
}
int main (void)
{
uint16_t little = 0xAABB;
uint16_t big;
little_to_big16((uint8_t*)&big, (uint8_t*)&little);
printf("%"PRIx16, big);
}
x86 小端輸出:
bbaa
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/384305.html
上一篇:如何從Prometheus服務器獲取按特定標簽過濾的所有指標名稱
下一篇:向下轉換指標到指標
