基于Netty高性能RPC框架Nifty协议、传输层、编解码( 五 )
private byte[] i32rd = new byte[4];public int readI32() throws TException {byte[] buf = i32rd;int off = 0;if (trans_.getBytesRemainingInBuffer() >= 4) {buf = trans_.getBuffer();off = trans_.getBufferPosition();trans_.consumeBuffer(4);} else {readAll(i32rd, 0, 4);}return((buf[off] }复制代码
这里的trans_在前面说过 , 就是TNiftyTransport , 由nifty包提供的 。
- trans_.getBytesRemainingInBuffer()表示的是内部持有的channelBuffer剩余字节数 , 即bufferEnd - bufferPosition; 如果有四个字节就读取4个字节 , 否则读取所有;
- buf = trans_.getBuffer()是获取transport内部的的buffer数组;
- off = trans_.getBufferPosition();是获取transport内部buffer当前读取到的位置 , 即bufferPosition;
- trans_.consumeBuffer(4);则是transport内部buffer消费4个字节 , 即bufferPosition += 4;
- 关于返回值 , 注意到16进制的0xff就是二进制的11111111 , 最终结果就是将四个字节拼接在一起构成一个int值
再来看readString:
public String readString() throws TException {int size = readI32();checkStringReadLength(size);if (trans_.getBytesRemainingInBuffer() >= size) {String s = new String(trans_.getBuffer(), trans_.getBufferPosition(), size, "UTF-8");trans_.consumeBuffer(size);return s;}return readStringBody(size);}复制代码
首先读取四个字节构成的size , 表示需要读取多少byte从而来构造string 。 在获取buffer和position , 从而从buffer的position位置读取size个字节 , 构造出string;最后需要移动position再返回string结果 。作者:可以回家加班吗链接:来源:掘金著作权归作者所有 。 商业转载请联系作者获得授权 , 非商业转载请注明出处 。
推荐阅读
- 华硕基于WRX80的主板现身 为AMD Ryzen Threadripper Pro打造
- 微软新版电子邮件客户端截图曝光:基于网页端Outlook
- 优刻得边缘计算产品正式更名UEC,打造低延时、高性能、低成本计算平台
- 曝光 | 小鹏或春节前推送NGP更新,基于高精地图可自动变道
- 基于Spring+Angular9+MySQL开发平台
- 玩游戏为什么推荐你买魅族17 不仅仅是高性能
- 14款华为手机/平板公测EMUI 11:全部基于麒麟980
- AI赋能,让消防、用电更“智慧”
- 深入理解Netty编解码、粘包拆包、心跳机制
- 基于安卓11打造!魅族17系列将升级全新Flyme 8