Java - Socket不会写出正确的十六进制值

时间:2016-08-10 07:46:57

标签: java sockets hex

我写了int十六进制值数组但是当我读它们时,一些值被破坏了 但是当我在写之前读取它时,它会识别它们 我注意到只有被解释为负整数结果的字节值才会被破坏 有人有解决方案吗?

  

起始值:4D | 73 | 00 | 17 | 31 | C2 | 00 | A0 | 15 | 01 | 02 | 03 | FF | FF | FA | 5D

我的课程:

public class MySocket extends Socket {
    OutputStream os;
    OutputStreamWriter osw;
    BufferedWriter bw;    

    MySocket(String h, int p) throws IOException {
        super(h, p);
        os = this.getOutputStream();
        osw = new OutputStreamWriter(os, "UTF-8");
        bw = new BufferedWriter(osw);
    }

    public void write(int[] str) {
        try {
            for (int i=0; i<str.length; i++) {
                char s = (char)str[i];
                System.out.println("byte: " + (byte)str[i] + 
                        " -- char: " + (char)str[i] +
                        " -- int: " + str[i]);
                bw.write(str[i]);
            }
            bw.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
         MySocket s = new MySocket("host", port); //connection is OK
         int[] hexarray = {0x4D, 0x73, 0x00, 0x17, 0x31, 0xC2,
                            0x00, 0xA0, 0x15, 0x01, 0x02,
                            0x03, 0xFF, 0xFF, 0xFA, 0x5D};
         socket.write(hexarray); 
    }
}

/* ------------------------------------------------
   ------------- OUTPUT ---------------------------
    byte: 77 -- char: M -- int: 77 -- hex: 4D
    byte: 115 -- char: s -- int: 115 -- hex: 73
    byte: 0 -- char:   -- int: 0 -- hex: 0
    byte: 23 -- char:  -- int: 23 -- hex: 17
    byte: 49 -- char: 1 -- int: 49 -- hex: 31
    byte: -62 -- char: Â -- int: 194 -- hex: C2
    byte: 0 -- char:   -- int: 0 -- hex: 0
    byte: -96 -- char:   -- int: 160 -- hex: A0
    byte: 21 -- char:  -- int: 21 -- hex: 15
    byte: 1 -- char:  -- int: 1 -- hex: 1
    byte: 2 -- char:  -- int: 2 -- hex: 2
    byte: 3 -- char:  -- int: 3 -- hex: 3
    byte: -1 -- char: ÿ -- int: 255 -- hex: FF
    byte: -1 -- char: ÿ -- int: 255 -- hex: FF
    byte: -6 -- char: ú -- int: 250 -- hex: FA
    byte: 93 -- char: ] -- int: 93 -- hex: 5D
*/
  

阅读值:4d | 73 | 00 | 17 | 31 | c3 | 82 | 00 | c2 | a0 | 15 | 01 | 02 | 03 | c3 | bf | c3 | BF | C3 | BA | 5D

1 个答案:

答案 0 :(得分:4)

问题是您使用的是WriterWriterReader API用于读取和写入字符数据。但是你正在编写二进制数据。

  1. 使用OutputStream / BufferedOutputStream API。

  2. 您无法撰写int[]。请改用byte[]

  3.   

    我注意到只有被解释为负整数结果的字节值才会被破坏。

    这是因为int(或byte)已签名,但char未签名。因此,当您将负int(或byte)投射到char时,它将会回滚。

    例如:

    • 字节0xFF是-1
    • 当您将其分配给int时,您会得到0xFFFFFFFF(也是-1)
    • 当你将其转换为char时,你会得到0xFFFF,这是"Specials"代码页中的Unicode代码点。

    简而言之,&#34;腐败&#34;你看到的是因为你的代码以错误的方式将字节/整数转换为字符。

      

    套接字没有写出正确的十六进制值

    实际上,这不是Socket特定行为......如果您使用API​​,它们将会起作用。我建议您阅读Java Tutorial的Character and Byte Streams部分。