簡體   English   中英

確定uint32_t的字節順序

[英]Determine byte order of uint32_t

我正在將vxWorks應用程序轉換為Linux。

以前,我使用一個word和一個struct union ,以便在訪問該struct的成員時,可以使用該word's布局來構建我的struct成員。

但是,我不記得我是怎么想出來的,它可以在vxWorks盒子上使用。 在我的vxWorks實例上,布局為:

typedef union Status
{
    struct fields
    {
        uint32_t byteA : 1; // <31>
        uint32_t blank : 23; // <30:8>
        uint32_t bytesN : 8; // <7:0>
    } fields;

    uint32_t word;
}

從vxWorks移植到Linux時,我已經遇到了一些字節序問題。 因此弄清楚uint32_t在Linux上的布局很重要。

您可以通過將指針指向包含值0x01的int並將其強制轉換為char *來判斷。 如果第一個值等於零,則系統為大端,否則為小端。

這是一個例子:

#include <inttypes.h>
#include <stdio.h>

int main(void)
{
   uint32_t   val  = 0x01;
   char     * buff = (char *)&val;

   if (buff[0] == 0)
   {
      printf("Big endian\n");
   } else {
      printf("Little endian\n");
   };

   return(0);
}

我在Linux,Solaris,OS X和FreeBSD上使用了這種方法。

從其他您的評論的答案 ,任何你想要被塞進word的成員union出現在fields.bytesN成員。 為此,您必須具有某種預構建過程,以在檢測到機器字節序后適當地布局field位字段,或者創建2個結構,一個用於大字節序,另一個用於小字節序。

typedef union Status
{
    struct fieldsBE
    {
        uint32_t byteA : 1; // <31>
        uint32_t blank : 23; // <30:8>
        uint32_t bytesN : 8; // <7:0>
    } fieldsBE;

    struct fieldsLE
    {
        uint32_t bytesN : 8; // <7:0>
        uint32_t blank : 23; // <30:8>
        uint32_t byteA : 1; // <31>
    } fieldsLE;

    uint32_t word;
};

int main()
{
  bool isBigEndian = DetectEndianness(); // returns true if big endian

  Status status;

  status.word = 40;

  if( isBigEndian ) {
    uint8_t bytesN = status.fieldsBE.bytesN;

  } else {
    uint8_t bytesN = status.fieldsLE.bytesN;

  }
}

當然,如果您只想在端口中支持Little Endian,請使用fieldsLE的布局,而不要使用已顯示的原始布局。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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