簡體   English   中英

如何將 UINT16 轉換為兩個有符號字符?

[英]How to convert UINT16 into two signed chars?

我進行這種轉換是因為從網絡接收的數據是一個unsigned char[8]數組。 每兩個字節代表一個 UINT16 數字。 我想通過套接字發送這些字節,但是,套接字需要對字符進行簽名(我正在使用 little-endian)。

由於無法將無符號字符轉換為有符號字符,我想我可以從兩個無符號字符形成一個 UINT16 數字,然后將該數字分解為兩個有符號字符。

我的代碼適用於 UINT16 數字介於 [0,127] 和 [256,65535] 之間的情況,但當值介於 [128,255] 之間時,第一個字符會上升到 ~4294967295,而 UINT16 現在表示為 ~65535。 任何解釋/解決方案?

uint16_t in = 129;
cout << "input is\t" << in << endl;

char lo = in & 0xFF;
char hi = in >> 8;

printf("%u", lo);
cout << "\n" << endl;
printf("%u", hi);
cout << "\n" << endl;

uint16_t out = lo | uint16_t(hi) << 8;

cout << "out is\t" << out << endl;

當我通過套接字發送 unsigned char[]時得到的錯誤; 如果我使用以下初始化,我可以將它用作通過套接字(winsock) send()函數的適當參數。 工作得很好。

char buffer[8]
for (int i= 0; i <8; i++){
 buffer[i] = 0x016; //random data
  }
send(clientSocket, buffer, 8, 0);

但是,如果按如下方式初始化緩沖區,則會出現錯誤:

unsigned char buffer[8]
for (int i=0; i < 8;i++){
 buffer[i] = 0x016; //again random data
 }
 send(clientSocket, buffer,8,0);

錯誤說明:

int send (SOCKET, const char *, int, int)':無法將參數 2 從 unsigned char[8] 轉換為 const char *

[這是針對 C 的回答。OP 尚未闡明他們對 C 與 C++ 答案的需求。]

要使用send函數傳遞一個名為bufferunsigned char數組,該函數有一個const char *類型的參數,只需將數組轉換為所需的類型,如下所示:

send(socket, (const char *) buffer, length, flags);

在 C 中,字符類型用於處理數據的“原始字節”(以及用於編碼字符,這是含義和用途的不幸混淆),因此您可以通過這種方式發送任何類型的數據。 套接字例程不會根據任何特定類型解釋數據; 他們只會傳輸比特而不考慮任何簽名。 您可以使用不帶const的相同類型轉換來接收數據,只要數據寫入與它最初來自的相同類型的對象即可。

(可能存在發送和接收系統對各種事物使用不同表示形式的問題,例如大端存儲在一個上,小端存儲在另一個上,或者long類型在一個字節上四個字節,另一個字節在八個字節上,或者不同的填充和結構對齊。這些是與通過套接字傳輸原始數據無關的單獨問題。)

正如 Kaz 所指出的,現代 API 通常將此類參數聲明為void *const void * ,並且在將其他對象指針傳遞給它們時不需要強制轉換。如果您遇到一些關於此的編譯器警告消息,您可能使用的是過時的API。)

暫無
暫無

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

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