2010-08-01 43 views
0

這裏是Java新手。是否有任何幫助函數將數據序列化爲字節數組?我正在編寫一個實現網絡協議的Java包。所以我必須在循環中編寫一些典型的變量,如版本(1字節),序列號(長)和二進制數據(字節)。我如何在Java中做到這一點?來自C我想創建一個所需的大小的字節數組,然後因爲沒有memcpy()我將長轉換爲臨時字節數組,然後將其複製到實際的字節數組。看起來效率很低,也很容易出錯。有沒有我可以用來編組和解組參數到一個字節數組的類?Java和二進制數據在套接字環境下

爲什麼所有的Socket類只處理char []而不是byte []?定義一個套接字也必須處理二進制數據。這在Java中如何完成?

我相信我缺少的是Java的心態。欣賞它,如果有人能指給我。

編輯:我沒有看DataOutputStream和DataInputStream,但我不能將字節轉換爲字符串而不是字節[],這意味着信息可能在寫入套接字的轉換中丟失。

  • 帕烏

回答

2

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

+0

請參閱上面的編輯 – user220201 2010-08-01 17:19:50

+0

套接字是InputStreams&OutputStreams,您需要將DIS/DOS層疊在它們上面。另外,對於String和byte []之間的轉換,您需要在'new String()'或'String#getBytes()'中指定字符集,或使用Reader/Writer。 – 2010-08-02 08:26:03

0

插座既不處理char[]也不處理byte[],但InputStreamOutputStream用於讀取和寫入字節。

0

如果您通過套接字發送數據,則根本不需要臨時字節數組;你可以用DataOutputStream或ObjectOutputStream封裝套接字的OutputStream,並且只寫你想寫的東西。

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

0

如上所述,DataInputStream和DataOutputStream正是您所需要的。回想一下你對String的評論,如果你打算通過網絡使用Java Strings,你不是在設計一個網絡協議,而是在設計一個Java協議。如果您確定另一端是Java,或者您可以編碼另一端以瞭解這些格式,則有readUTF()和writeUTF()。或者,您可以將字節與相應的字符集一起發送,或者爲整個協議預定義字符集(如果有意義的話)。