就是这样。byte用short就可以。 说的详细点,比如c端是无符号byte,那么你只要定义short a = 220;然后写到协议数组的时候byte(a)强行转换。 如果你还要从c端读取,那么也要用short来接收:short a = mybyte;否则如果数据超过127,你java端读取的时候就会显示负数了.
我给几个工具方法,你自己看看,只是这里的输入流,我已经读取到应用层的缓冲区了 public static final int INT8_MASK = 0xFF; public static final int int8(ByteBuffer buf) { return buf.get(); } public static final int uint8(ByteBuffer buf) { return buf.get() & INT8_MASK; } // 这个类似你说的定长的 public static final String string(ByteBuffer buf, int length) { byte[] bs = new byte[length]; buf.get(bs); return new String(bs); } // 这个是小端的byte数组转整型 public static int byte2Int(byte[] src) { int ret = 0; for (int i = src.length - 1; i >= 0; i--) { ret = (ret << 8) | (src[i] & 0xFF); } return ret; }
Octet String(定长字符串):byte[] b = new byte[n] ,n 代表定长的长度最后添加‘\n’结束字符Unit16_t(16 位无符号整型):intUnit32_t(32 位无符号整型):int
String str="hkkpssy";
int x=0x10080001;
byte bt[]=new byte[8];
Arrays.fill(bt, (byte)'\n');
System.arraycopy(bt,0,str.getBytes(),0,str.length());
BufferedOutputStream out=new BufferedOutputStream(socket.getOutputStream());
out.write(bt,0,bt.length);
out.write(x);
out.flush();
int x=0x10080001;
byte bt[]=new byte[8];
Arrays.fill(bt, (byte)0);
byte s[]=str.getBytes();
System.arraycopy(bt,0,s,0,s.length);
BufferedOutputStream out=new BufferedOutputStream(socket.getOutputStream());
out.write(bt,0,bt.length);
out.write(x);
out.flush();
说的详细点,比如c端是无符号byte,那么你只要定义short a = 220;然后写到协议数组的时候byte(a)强行转换。
如果你还要从c端读取,那么也要用short来接收:short a = mybyte;否则如果数据超过127,你java端读取的时候就会显示负数了.
这样的转发吗? Java做代理? 如果是这种,读到啥就转啥就行了,什么也不用做,除非你要解析数据。
public static final int int8(ByteBuffer buf) {
return buf.get();
}
public static final int uint8(ByteBuffer buf) {
return buf.get() & INT8_MASK;
}
// 这个类似你说的定长的
public static final String string(ByteBuffer buf, int length) {
byte[] bs = new byte[length];
buf.get(bs);
return new String(bs);
}
// 这个是小端的byte数组转整型
public static int byte2Int(byte[] src) {
int ret = 0;
for (int i = src.length - 1; i >= 0; i--) {
ret = (ret << 8) | (src[i] & 0xFF);
}
return ret;
}
struct {
char data_str[8];
u_int32_t data_int32;
u_int16_t data_int16;
} data;
if(readn_timeout(fd, (void *)&(data), sizeof(data), 30) < 0) {
printf("readn_timeout() failed");
return;
}
printf("Data_1:[%s], Data_2:[%d], Data_3:[%d]\n",
data.data_str, data.data_int32, data.data_int16); return;
}
JAVA客户端发送数据,代码如下:package com.test.exp;import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;public class TestClient { private static ByteBuffer getDataBuffer() {
ByteBuffer dataInfo = ByteBuffer.allocate(16);
dataInfo.order(ByteOrder.nativeOrder());
String data_1 = "hkkpssy";
int data_2 = 333;
short data_3 = 111;
byte[] data_1_bytes = data_1.getBytes();
int i = 0;
for(; i < Math.min(8, data_1_bytes.length); i++){
dataInfo.put(data_1_bytes[i]);
}
for(; i < 8; i++){
dataInfo.put((byte)0);
}
dataInfo.putInt((int)data_2);
dataInfo.putShort((short)data_3);
dataInfo.rewind();
return dataInfo;
}
public static void main(String[] args) {
String serverIP = "192.168.233.34";
int serverPort = 50000;
try {
Socket theSocket = new Socket(serverIP , serverPort);
OutputStream out = theSocket.getOutputStream();
byte[] data = getDataBuffer().array();
System.out.println(data.length);
out.write(data);
theSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}