前面一篇简书中有提到netty读取到负数的原因:
1.高低端
2.有符号数/无符号数
https://www.jianshu.com/p/ae631ba01971
那这里在说一下有符号数与无符号数在JAVA中转换时的一些个人理解。
疑惑的起因是这样的:
之前做了一个固件升级的服务端,固件向我发送命令时,是传递了一个无符号数。而JAVA中因为是有符号数,所以我使用ByteBuf.readUnsignedByte()/ByteBuf.readUnsignedShort()/ByteBuf.readUnsignedInt()/...
来接收。但是这里产生了一个问题。我们知道,将一个无符号转为有符号数,无非是再多加一个字节,使最高位的符号位不被系统认为是个符号,而由此一来read得到的无符号数单位会比原本的单位多出一个字节。如果按照原单位类型来存储,则涉及到long->int,int->short,short->byte的强制转型,根据我的运算和代码运行结果测试。强制转型后的结果和直接读取一个有符号数结果是一样的
ByteBuf.class
//读取方法
public abstract short readUnsignedByte();
public abstract int readUnsignedShort();
public abstract long readUnsignedInt();
//写入方法
public abstract ByteBuf writeByte(int value);
public abstract ByteBuf writeShort(int value);
public abstract ByteBuf writeInt(int value);
public abstract ByteBuf writeLong(long value);
当读取时,byte类型的无符号数会返回一个short,而short类型的无符号数会返回一个int,int类型的无符号数会返回一个long...
当写入时,写入一个int类型需要一个int参数,写入一个short需要一个int参数,写入byte还是一个int参数(写入long需要传入long)
总结:
当对方传给我们一个无符号数时,我们用ByteBuf.readUnsigned...()的方法去获取,获取的结果数据类型会多一个字节,用于我们逻辑处理时需要使用的值。因为我在前面说过,强制转型后的结果和直接读取一个有符号数结果是一样的
,所以不用担心readUnsignedXxx()方法的结果强转更小的数据类型后会丢失精度,而在写出时该类的底层会将有符号数转为无符号数写出。
所以获取无符号数的操作可以仅作为我们获取数据中的数值使用,写入时直接写入有符号数即可。