将字节数组转换为Int数组以通过Java套接字

时间:2015-05-12 09:47:38

标签: java arrays sockets

您好我是Java开发新手并且遇到以下问题。

我构造一个值为{130,56,0,0,2,0,0,0}的char数组。 然后我使用String.valueOf()将这些值传递给String,一旦完成,我使用getBytes()函数将sting转换为字节数组。

我使用DataOutputStream编写器将数据写入套接字。 我的问题在于,在使用wireshark跟踪数据的tcp级别上,我实际上在线路上发送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套接字编写器

在线路上发送130 56 0 0 2 0 0 0

为了论证而说以下是必要的

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

                byte[] data = StringMsg.getBytes();

3 个答案:

答案 0 :(得分:2)

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有两个左字节移位运算符>>>>>(第二个不&#34;携带&#34;符号位)的原因。

顺便说一句,Java原始类型是大端的 - 即使底层架构不是。

答案 1 :(得分:0)

您必须了解十六进制A和字符A之间的区别。 Hex A指的是二进制值1010,而字符A则没有。考虑到这一点,如果要存储字节,只需使用字节数组或ByteBuffer

答案 2 :(得分:0)

  

我构造一个值为{130,56,0,0,2,0,0,0}的char数组。

为什么?

  

然后我使用String.valueOf()

将这些值传递给String

为什么呢? DataOutputStream不是二进制数据的容器。

  

一旦完成,我使用getBytes()函数将sting转换为字节数组。

为什么?

为什么不将原始数据直接构造成一个字节数组并切断整个palaver?

  

我使用DataOutputStream编写器

Writer.是一个流,而不是{{1}}

  

将数据写入套接字。我的问题在于,在使用wireshark跟踪数据的tcp级别上,我实际上在线路上发送c2 82 38 00 00 02 00 00 00而不是原始130 56 0 0 2 0 0 0。

正如预测的那样。那么为什么不将原始数据作为字节数组发送,并删除了几个容易出错的步骤呢?