在做报文的封装或者解析工作前,首先要对“进制”要有一个简单的了解。
国标数据类型

通过对《GBT32960.3-2016》这份协议文档的阅读,能够发现以上各数据类型常用于使用的数据如下:
BYTE:各种状态或数值长度在3位数以内的数据;
WORD:数值长度在5位数以内。例如电压值、电流值、转速;
DWORD:数值长度在8位数以内。例如历史行驶里程数、坐标经纬度;
BYTE[,]:例如燃料电池的温度探针会涉及N个;
STRING:车辆VIN码、SIM卡的ICCID
使用Java数据类型怎么对于国标数据类型
首先我们得清楚Java常用的基本数据类型占多少个字节:
- byte-1个字节
- boolean-1个字节
- short-2个字节
- char-2个字节
- int-4个字节
- float-4个字节
- long-8个字节
- double-8个字节
- string-按内容长度读取
注:1字节(byte)=8位(bits)
怎么使用Java读取
由于国标协议采用大端模式的网络字节序来传递字和双字,并且是按顺序读取,所以我们接收数据并且读取转换成我们可以使用的基本数据类型时,通常使用io.netty.buffer.ByteBuf来处理。现在就举个简单的例子让大家更直白的了解。
package com.apigate;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import cn.hutool.core.util.CharsetUtil;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.UnpooledByteBufAllocator;
import io.netty.util.ReferenceCountUtil;
public class ByteTest {
public static void main(String[] args) {
byte b = 1;
boolean b1 = true;
short s = 2;
char c = 'c';
int i = 3;
float f = 4;
long l = 5;
double d = 6;
String s1 = "s";
// 写
ByteBuf dataBuf = UnpooledByteBufAllocator.DEFAULT.heapBuffer();
dataBuf.writeByte(b);
dataBuf.writeBoolean(b1);
dataBuf.writeShort(s);
dataBuf.writeChar(c);
dataBuf.writeInt(i);
dataBuf.writeFloat(f);
dataBuf.writeLong(l);
dataBuf.writeDouble(d);
try {
dataBuf.writeBytes(s1.getBytes(CharsetUtil.UTF_8));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
// 读
System.out.println("b = " + dataBuf.readByte());
System.out.println("b1 = " + dataBuf.readBoolean());
System.out.println("s = " + dataBuf.readShort());
System.out.println("c = " + dataBuf.readChar());
System.out.println("i = " + dataBuf.readInt());
System.out.println("f = " + dataBuf.readFloat());
System.out.println("l = " + dataBuf.readDouble());
System.out.println("d = " + dataBuf.readDouble());
byte[] strBytes = new byte[s1.length()];
dataBuf.readBytes(strBytes);
System.out.println("s1 = " + new String(strBytes, Charset.forName("utf-8")));
ReferenceCountUtil.release(dataBuf);
}
}
821

被折叠的 条评论
为什么被折叠?



