簡體   English   中英

從C ++發送uint32_t到Java

[英]Send uint32_t from C++ to Java

我目前正在用C ++和Android應用編寫服務器,並使用google protobuf從中接收數據。 目前,我以大小來構圖數據,所以基本上我發送

-----------------------------------------------------
| payload size (4byte, unsigned) | protobuf payload |
-----------------------------------------------------

我對Java中的內容進行反序列化沒有問題,但是如何將字節從套接字轉換為無符號整數? payload size始終是uint32_t ,已使用htonl將其轉換為網絡字節順序。 因此,Java需要轉換為主機字節順序並將其轉換為Integer。

好的,因此,在Java中,整數始終為32位,因此您只需要讀取這四個字節,然后使用ByteBuffer將其轉換為整數即可。 您可能會認為我們需要指定字節順序,但是事實證明ByteBuffers默認以大端順序讀取字節,因此已經可以用於網絡順序:

byte[] bytes = ...;
int size = ByteBuffer.wrap(bytes).getInt();

但是,由於Java中的所有整數都是帶符號的,因此如果它太大,則上述size可能最終為負。 您可能不想要那樣。 您可以將其強制轉換為long,但是如果int為負,則其符號將被擴展,最終您將得到負long。

解決方案是將其解釋為long,即使它是有符號的,它也是64位,因此足夠大以表示32位無符號整數。 幸運的是,Java 8中有一個方法可以做到這一點:

long actualSize = Integer.toUnsignedLong(size);

隨您去,現在您可以玩大號了。

暫無
暫無

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

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