Java中的字节操作和数据报
我正在尝试编写一个握手类型的消息,如下所示,其中C=客户机S=服务器:Java中的字节操作和数据报,java,int,byte,datagram,Java,Int,Byte,Datagram,我正在尝试编写一个握手类型的消息,如下所示,其中C=客户机S=服务器: 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数据
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位的,我更喜欢使用这种数据类型,但我似乎遇到了两个问题之一:
- 上面提到的是bytebuffer
- 通过位移位转换:
//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;
//int到字节[] int val=someval; 字节[]字节=新字节[4]; 对于(int i=0;i<4;i++) 字节[i]=(字节)(val>>>(i*8)); //字节[]到int int-val=0; 字节[]字节=输入(); 对于(int i=0;i<4;i++)
val |=((int)(bytes[i])这些操作都不难
和DataInputStream
处理DataOutputStream
转换,以及stream->int->stream
和ByteArrayInputStream
处理ByteArrayOutputStream
流-/code>转换。如果您正在定义自己的数据报格式,很容易确定第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; }
公共静态字节[]toByteArray(int值){ 字节[]b=新字节[4]; //MSB到LSB b[0]=(字节)(值>>24); b[1]=(字节)(值>>16); b[2]=(字节)(值>>8); b[3]=(字节)(值); 返回b; } 来自ByteArray的公共静态int(字节[]值){
int i=(((int)value[0])&0xFF)关于以字节数组的形式发送信息,我认为您没有太多选择。您还可以如何发送它?