簡體   English   中英

將字節數組轉換為整數數組以通過Java套接字發送

[英]Converting Byte Array to Int Array to send over java socket

嗨,我是Java開發的新手,有以下問題。

我用值{130,56,0,0,2,0,0,0}構造了一個char數組。 然后,我使用String.valueOf()將這些值傳遞到String中,一旦完成,我將使用getBytes()函數將字符串轉換為字節數組。

我使用DataOutputStream編寫器將數據寫入套接字。 我的問題在於以下事實:在tcp級別上,使用wireshark跟蹤數據,我實際上是在網上發送c2 82 38 00 00 02 00 00 00,而不是原始的130 56 0 0 2 0 0 0。

下面的代碼段

public void run() {
        System.out.println("Got a client !");
        try {
            // Accept Loop while connected
            while (true) {
                byte[] arrOutut = new byte[4096];
                int count = clientSocket.getInputStream().read(arrOutut, 0, 4096);
                String clientRequest = "";
                System.out.println("packet size is  " + count + "\n");
                if (count != -1) {
                    for (int outputCount = 0; outputCount < count; outputCount++) {
                        char response = (char) arrOutut[outputCount];
                        clientRequest = clientRequest + response;
                    }
                    System.out.println("Got a clientrequest "+ clientRequest + "\n");
                    count = 0;

                } else {
                    break;
                }

                char[] Map = new char[]{130,56,0,0,2,0,0,0};

                String StringMsg = String.valueOf(Map, 0, Map.length);

                byte[] data = StringMsg.getBytes();
                byte[] asciidata = StringMsg.getBytes("ASCII");

                System.out.println("Byte Data "+ data); 
                System.out.println("Byte Data ACII" + asciidata);

                OutputStream dOut = clientSocket.getOutputStream();
                DataOutputStream dos = new DataOutputStream(dOut);
                int sendDataLength = data.length;

                dos.write(data, 0, sendDataLength);
                dos.flush();


            }
            clientSocket.close();
            } catch (SocketTimeoutException e) {
            System.out.println("Connection timed out");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

反正我使用java socket writer在網上發送130 56 0 0 2 0 0 0

為爭辯說,以下是必要的

String StringMsg = String.valueOf(Map, 0, Map.length);

                byte[] data = StringMsg.getBytes();

char 不用於存儲二進制數據 是的,它在C中存儲一個帶符號的8位整數。 但是,在Java中, char是UTF16代碼單元。

你想在這里byte 更具體地說,您需要一個ByteBuffer

final ByteBuffer buf = ByteBuffer.allocate(8);

buf.put((byte) 130);
// etc etc

// send buf.array() on the wire; or use a SocketChannel and use buf directly

是的,每次都必須強制轉換為一個byte是一件很痛苦的事情,但是事實就是這樣://


同樣,很多人對此感到困惑(我當時是從C語言開始使用Java的),但是原始類型是無符號的這一事實根本無關緊要; 位保留位。 例如,字節-128(或Byte.MIN_VALUE )是1111 1111 除非必須對數字執行算術運算,否則圖元是否為負的事實根本沒有影響。 順便說一句,這也是Java具有兩個用於左字節移位的運算符>>>>> (第二個運算符不“攜帶”符號位)。

順便說一下,Java基本類型是大端字節序的-即使底層體系結構不是。

您必須了解十六進制A和字符A之間的區別。 十六進制A表示二進制值1010 ,而字符A則不是。 考慮到這一點,如果您要存儲字節,只需使用字節數組或ByteBuffer

我用值{130,56,0,0,2,0,0,0}構造了一個char數組。

為什么?

然后,我使用String.valueOf()將這些值傳遞給String。

為什么? String不是二進制數據的容器。

一旦完成,我將使用getBytes()函數將字符串轉換為字節數組。

為什么?

為什么不將原始數據直接構造為字節數組並剪切整個Palaver?

我使用DataOutputStream編寫器

DataOutputStream是流,而不是Writer.

將數據寫入套接字。 我的問題在於以下事實:在tcp級別上,使用wireshark跟蹤數據,我實際上是在網上發送c2 82 38 00 00 02 00 00 00,而不是原始的130 56 0 0 2 0 0 0。

完全符合預期。 那么,為什么不將原始數據作為字節數組發送,並減少幾個容易出錯的步驟呢?

暫無
暫無

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

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