![](/img/trans.png)
[英]Can we typecast buffer into C++ structure on client when server is sending data as c structure?
[英]Can we swap the endianness of a data buffer, which is a fixed sized array, before mapping it to its eventual data structure?
場景:遠程機器(大端)通過RS422向本地機器(小端)發送消息。
本地機器將消息作為緩沖區獲取,即dataBuffer
,它是一個包含4個16位整數的數組。 此緩沖區數據最終會映射到程序中的某個MainType
數據,但這不是我們關注的問題。 我們需要一個使用swapData()
方法交換字節(更改字節順序)的swapData()
。
問題:鑒於MainType
正好有4
數據成員,每個16 bits
AND dataBuffer
是大小為4的數組,每個數據是16位,我們可以只交換緩沖區中的數據而不將其映射到MainType
數據結構(如下所示)?
約束:
dataBuffer
需要在程序中是全局的, swapData()
函數中處理, data
將用其他方法填充,例如useData()
這是代碼:
...
typedef unsigned short int USINT16;
typedef struct {
USINT16 a : 1;
USINT16 b : 1;
USINT16 c : 1;
USINT16 d : 1;
USINT16 e : 1;
USINT16 f : 1;
USINT16 g : 1;
USINT16 h : 2;
USINT16 i : 3;
USINT16 j : 4;
} OtherType; // 16 bits
typedef struct {
USINT16 X;
USINT16 Y;
USINT16 Z;
OtherType W;
} MainType;
...
unsigned short dataBuffer[4]; // available in global scope
...
void swapData() {
receiveData(&dataBuffer); // data buffer is filled
int i;
for (i = 0; i < 4; i++) {
dataBuffer[i] = __builtin_bswap16(dataBuffer);
}
// The data is little endian now ?
}
...
void useData() {
MainType data; // map the swapped buffer to data
// use the data etc.
....
}
如果遠程計算機行為被凍結,您可以調查並確定該平台上的位字段的編碼是什么,並適當地轉換在本地計算機上接收的緩沖區。
字節交換所有16位條目(包括W
)是一個很好的初始步驟,您可能必須更改OtherType
的struct
定義以適合遠程計算機的編譯器定義的順序。 您可以通過從遠程計算機傳輸樣本來確定,其中只有1個字段設置為所有位1,其他位置保持為0並打印接收到的16位值。
建議使用字節交換W
,因為Wh
很可能落在字節邊界上,每個字節有1位。 要使其在本地機器中相鄰的位,應交換W
的字節。 如果遠程機器上的位順序是對於W
的整個16位字abcdefg h1 h0 i2 i1 i0 j3 j2 j1 j0
,當存儲在遠程機器的存儲器中時,它變為<abcdefg h1>
<h0 i2 i1 i0 j3 j2 j1 j0>
隨后作為字節發送並加載到本地機器上的16位寄存器中,如果不交換字節,它將變為h0 i2 i1 i0 j3 j2 j1 j0 abcdefg h1
,因為第一個字節以低位加載寄存器的位。 字節交換可以防止這種情況,但是您仍然可能在本地計算機中遇到位字段順序問題, j3 j2 j1 j0 i2 i1 i0 h1 h0 gfedcba
如果位字段可能從最低位分配,則當前定義可能被編碼為j3 j2 j1 j0 i2 i1 i0 h1 h0 gfedcba
到最高位位置。
如果您知道某種匯編語言,請生成用於操作兩個平台上的位字段的代碼的程序集,並檢查字段的放置方式是否不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.