簡體   English   中英

在將數據緩沖區映射到最終數據結構之前,我們是否可以交換數據緩沖區的字節順序,這是一個固定大小的數組?

[英]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 )是一個很好的初始步驟,您可能必須更改OtherTypestruct定義以適合遠程計算機的編譯器定義的順序。 您可以通過從遠程計算機傳輸樣本來確定,其中只有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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM