我正在尝试按如下方式编写握手类型消息,其中C = Client S = Server:
C-->S: "I'd like to talk" //session initiation
S-->C: "80" //(n, randomly generated number)
C-->S: "81" //(n+1)
S: "does n= (n+1)-1?" //confirms the connection.
出于这个问题的目的,假设上面的逻辑是正确的。我希望我生成的随机数是32位数(即UDP数据报中发送的4个字节)。由于int是32位,我宁愿使用这种数据类型,但我似乎遇到了两个问题之一:
我找到了一个可以从int转换为字节的方法。我找到了一些关于使用Bytebuffer转换为int的信息,但我不确定它是否正确。有没有更简单的方法来处理在数据报中发送int的过程?在字节和整数之间来回转换似乎是一项非常大的工作。
答案 0 :(得分:1)
任何这些行动都没什么难的。 DataInputStream
和DataOutputStream
负责stream->int->stream
次转化,ByteArrayInputStream
和ByteArrayOutputStream
负责stream->byte[]->stream
次转化。
答案 1 :(得分:0)
有两种选择:
通过bitshift进行转换:
//int to byte[]
int val = someval;
byte[] bytes = new byte[4];
for(int i = 0 ; i < 4 ; i++)
bytes[i] = (byte) (val >>> (i * 8));
//byte[] to int
int val = 0;
byte[] bytes = input();
for(int i = 0 ; i < 4 ; i++)
val |= ((int)(bytes[i])) << i * 8;
答案 2 :(得分:0)
如果要定义自己的数据报格式,则很容易确定内容的第n个4字节表示整数。
然后,您可以使用一些简单的转换函数从int
转到byte[]
,反之亦然。
实现这两种方法的小类应该:
public static byte[] toByteArray(int value) {
byte[] b = new byte[4];
// MSB to LSB
b[0] = (byte) (value >> 24);
b[1] = (byte) (value >> 16);
b[2] = (byte) (value >> 8);
b[3] = (byte) (value);
return b;
}
public static int fromByteArray(byte[] value) {
int i = ((((int) value[0]) & 0xFF) << 24) |
((((int) value[1]) & 0xFF) << 16) |
((((int) value[2]) & 0xFF) << 8) |
((((int) value[3] & 0xFF)));
return i;
}