簡體   English   中英

將整數和字符串轉換為字節數組,然后反之

[英]Converting ints and strings into byte array and the reverse

我想將一些整數和一些字符串轉換為一個字節數組,然后再次返回。 我已經對如何進行轉換進行了一些研究,但是不確定是否全部正確。

將字符串轉換為字節數組很容易:
byte[] bytes = string.getBytes();

通過Arrays.toString()再次將其轉換回去,因為這只會創建一個字節字符串。

這樣做有效嗎: String s = new String(bytes);

將int轉換為字節數組是這樣的:

int[] data = { int1, int2, int3 }; 
ByteBuffer byteBuffer = ByteBuffer.allocate(data.length * 4);
IntBuffer intBuffer = byteBuffer.asIntBuffer();
intBuffer.put(data);
byte[] my_app_state = byteBuffer.array();

但我不知道如何再次將其轉換回去。

我的目標是有發言權4個整數和2個字符串轉換為一個字節數組,然后將它們再轉換回。

例如。 我有這些對象,希望將它們轉換為相同的字節數組。

int int1 = 1;
int int2 = 2;
int int3 = 3;
int int4 = 4;
String s1 = "mystring1"
String s2 = "mystring2"

更新:刪除了我認為存在問題的代碼。 沒有。

對於每個操作,您都需要確定反向操作,而不僅僅是返回正確類型的任何操作。 例如,即使類型正確, n * 2也是m / 2而不是m - 2

Arrays.toString("Hi".getBytes()) => "{ 72, 105 }"

所以你可以做

text.getBytes() => new String(bytes) // if the same character encoding is used.

更好的選擇是

text.getBytes("UTF-8") => new String(bytes, "UTF-8");

數組的問題是,您有兩條信息, a length和一些bytes如果只寫字節,您將不再知道長度,因此無法輕松解碼(也許是不可能的)

在您的情況下,最簡單的選擇是使用數據流

// buffer which grows as needed.
ByteArrayOutputStream boas = new ByteArrayOutputStream();
// supports basic data types
DataOutputStream dos = new DataOutputStream(baos);
dos.writeInt(data.length);
for(int i: data) dow.writeInt(i);
// write the length of the string + the UTF-8 encoding of the text.
dos.writeUTF(s1);
dos.writeUTF(s2);
byte[] bytes = bytes.toByteArray();

要執行相反的操作,請使用InputStream和readXxxx而不是writeXxxx方法。

Java使實現此目標非常簡單,因為這是一個非常常見的用例。 您所需要的看起來非常像序列化。

序列化的工作方式如下:單個對象可以轉換為一組字節並存儲在字節數組中(通常用於寫入文件或通過網絡發送)。

好消息是,只要實現標記接口(僅一行代碼),任何對象都可以序列化。 另外,所有Wrapper數據類型以及String和Collections對象(例如ArrayList)都可以序列化。

提出您的問題: 將所有數據放在單個對象中並序列化該對象。 我想到了3個選項:1.一個Object []或ArrayList(如果您確定知道順序,以便可以根據位置進行訪問)2.一個HashMap,(如果可以給每個名稱分配一個名稱,則可以) (取決於位置)。3.使用諸如int1,int2或更有意義的名稱之類的字段創建自己的數據類型。 (您的類應實現Serializable)。

現在,所有數據都添加到一個對象中。 將此對象轉換為字節數組,您的工作就完成了。

檢查此鏈接,了解如何將單個對象轉換為字節數組: Java可序列化的對象轉換為字節數組

    Object[] payload = new Object[]{int1, int2, int3, int4, string1, string2};
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    ObjectOutputStream os = new ObjectOutputStream(out);
    os.writeObject(payload);
    byte[] result = out.toByteArray(); //Done

對於商店字符串,還必須使用類似

IntBuffer intBuffer = byteBuffer.asIntBuffer();
CharBuffer stringBuffer = byteBuffer.asCharBuffer();

那么您必須遍歷char[][] string = {s1.toCharArray(),s2.toCharArray()};上的循環char[][] string = {s1.toCharArray(),s2.toCharArray()}; 將每個字符放入stringBuffer中,您要做的更多事情是使您的byteBuffer足以容納這些值,我的朋友

暫無
暫無

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

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