簡體   English   中英

將聯合地址類型轉換為無符號 8 位 char* 可能是什么意思?

[英]What could be the meaning of typecasting a union's address as an unsigned 8 bit char*?

我遇到了一個嵌入式 c 代碼,包含以下用戶定義的類型:

union framebuffer{
  struct generic_frame frame;
  UCHAR8 data[256];
}

struct generic_frame{
  struct frame_header header;
  UCHAR8 raw[256];
};

struct frame_header{
  uint32_t preamble;
  uint16_t checksum;
  ...
};
int payload = 100;
union framebuffer handshakeReq;
transmit((UCHAR8 *)&handshakeReq,payload);//am not clear on what is (UCHAR8*)&handhshakeReq doing

注意:UCHAR8 類型應該被視為 8 位的 unsigned char,取值范圍為 0 到 255

假設傳輸()正在將此數據發送到套接字,另一端(java 套接字,因為 java 沒有聯合和結構)將接收什么?

結構或聯合的地址將與聚合的第一個元素的地址相同(好吧,就聯合而言,它們都具有相同的地址。它們進行類型轉換的原因是因為傳輸 function 期望有效負載為CHAR8 *類型。相反,他們可以使用handshake.data ,它是一個CHAR8[256] ,它應該衰減為一個指針。

首先,這些聯合的原因是因為它是 C 中的一種合法的類型雙關語形式,它允許將數據作為一種類型存儲並作為另一種類型訪問,這通過其他方式(獲取數據的地址-類型 A 並將其視為數據類型 B 以使 A 和 B 是不兼容的類型)將導致未定義的行為。

您看到的代碼沒問題的原因是因為字符類型有一個特殊的豁免,這樣您就可以訪問任何數據類型,就好像它是一個字符類型的數組一樣。

Sockets 不知道諸如structsunions之類的語言結構。 他們只是將數據作為字節序列發送。 當接收到這個字節序列時,將由 Java 代碼來解碼。

暫無
暫無

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

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