[英]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.