我写了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
答案 0 :(得分:4)
问题是您使用的是Writer
。 Writer
和Reader
API用于读取和写入字符数据。但是你正在编写二进制数据。
使用OutputStream
/ BufferedOutputStream
API。
您无法撰写int[]
。请改用byte[]
。
我注意到只有被解释为负整数结果的字节值才会被破坏。
这是因为int
(或byte
)已签名,但char
未签名。因此,当您将负int
(或byte
)投射到char
时,它将会回滚。
例如:
int
时,您会得到0xFFFFFFFF(也是-1)char
时,你会得到0xFFFF,这是"Specials"代码页中的Unicode代码点。简而言之,&#34;腐败&#34;你看到的是因为你的代码以错误的方式将字节/整数转换为字符。
套接字没有写出正确的十六进制值
实际上,这不是Socket
特定行为......如果您使用API,它们将会起作用。我建议您阅读Java Tutorial的Character and Byte Streams部分。