[英]Byte Operations and Datagrams in Java
我正在尝试编写一个握手类型的消息,如下所示,其中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的过程? 在字节和整数之间来回转换似乎是一项非常大的工作。
任何这些操作都没什么难的。 DataInputStream
和DataOutputStream
负责stream->int->stream
转换, ByteArrayInputStream
和ByteArrayOutputStream
负责stream->byte[]->stream
转换。
有两种选择:
通过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;
如果要定义自己的数据报格式,则很容易确定内容的第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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.