簡體   English   中英

套接字上下文中的Java和二進制數據

[英]Java and Binary data in the context of sockets

Java新手在這里。 是否有任何輔助函數可以在字節數組中對數據進行序列化? 我正在編寫一個實現網絡協議的Java包。 因此,我必須在循環中編寫一些典型變量,例如版本(1字節),序列號(長)和二進制數據(字節)。 我如何用Java做到這一點? 來自CI的人正在考慮創建所需大小的字節數組,然后由於沒有memcpy(),我將long轉換為臨時字節數組,然后將其復制到實際的字節數組中。 看起來效率很低,而且也很容易出錯。 有沒有可以用於將參數編組和解組到字節數組的類?

同樣為什么所有的Socket類都只處理char []而不處理byte []? 根據定義,套接字還必須處理二進制數據。 這是如何在Java中完成的?

我確定我缺少的是Java思維方式。 如果有人可以指向我,請感激它。

編輯:我確實看過DataOutputStream和DataInputStream,但是我無法將字節轉換為String而不是byte [],這意味着信息可能會在寫入套接字的轉換中丟失。

  • PAV

看一下DataInputStreamDataOutputStreamObjectInputStreamObjectOutputStream 首先檢查數據的布局是否可以接受。 另外,序列化。

套接字既不處理char[]也不處理byte[]而是處理用於讀取和寫入字節的InputStreamOutputStream

如果要通過套接字發送數據,則根本不需要臨時字節數組。 您可以使用DataOutputStream或ObjectOutputStream包裝套接字的OutputStream並只寫要寫的內容。

我可能錯過了一個方面,這意味着您實際上確實需要臨時字節數組。 如果是這樣,請查看ByteArrayOutputStream。 另外,當然沒有memcpy(),但是有System.arraycopy。

如上所述,DataInputStream和DataOutputStream正是您想要的。 關於String的評論,如果您打算通過網絡使用Java String,則您不是在設計網絡協議,而是在設計Java協議。 如果您確定另一端是Java或可以編寫另一端以理解這些格式,則有readUTF()和writeUTF()。 或者,您可以將字節和適當的字符集一起發送,或者在有意義的情況下為整個協議預定義字符集。

暫無
暫無

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

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