关于向 OutputStream 中直接写入 int 的细节问题
2017-10-23 15:39
316 查看
今天在《大型分布式网站架构设计与实践》(陈康贤著)一书中看到以下一段话,在此先 mark 一下:
“OutputStream 中直接写入一个 int 类型,会截取其低 8 位,丢弃其高 24 位,因此,需要将基本类型先转换为字节流。Java 采用的是 Big Endian 字节序。无独有偶,所有的网络协议也都是采用 Big Endian 字节序来进行传输的。因此,我们在进行数据的传输时,需要先将其转换成 Big Endian 字节序;同理,在数据接收时,也需要进行相应的转换”。
ByteArrayOutputStream:
SocketOutputStream:
关于 Endian:https://baike.baidu.com/item/Endian/10830754?fr=aladdin
“OutputStream 中直接写入一个 int 类型,会截取其低 8 位,丢弃其高 24 位,因此,需要将基本类型先转换为字节流。Java 采用的是 Big Endian 字节序。无独有偶,所有的网络协议也都是采用 Big Endian 字节序来进行传输的。因此,我们在进行数据的传输时,需要先将其转换成 Big Endian 字节序;同理,在数据接收时,也需要进行相应的转换”。
public static int bytes2Int(byte[] bytes) { int num = bytes[3] & 0xFF; num |= ((bytes[2] << 8) & 0xFF00); num |=((bytes[1] << 16) & 0xFF0000); num |=((bytes[0] << 24) & 0xFF000000); return num; }
public static byte[] int2ByteArray(int i) { byte[] result = new byte[4]; result[0] = (byte) ((i >> 24) & 0xFF); result[1] = (byte) ((i >> 16) & 0xFF); result[2] = (byte) ((i >> 8) & 0xFF); result[3] = (byte) (i & 0xFF); return result; }
ByteArrayOutputStream:
SocketOutputStream:
关于 Endian:https://baike.baidu.com/item/Endian/10830754?fr=aladdin
相关文章推荐
- 关于 JavaScript 中一个小细节问题 (在控制台中直接 {Name:'王尼玛',Age:20} 对象报错问题)
- 关于 myBatis 中的 jdbcType的细节问题
- 关于hibernate的session.createSQLQuery(sql)直接调用底层SQL后,返回结果集的问题
- 关于DAL层使用静态方法,并在WEB层直接调用的问题
- 关于Qt无法直接使用cout和cin的问题
- 关于调用startActivityForResult()方法后Activity直接退出的问题原因和解决办法
- JavaEE细节问题03——关于服务器和浏览器的编码解码
- 关于在ubuntu12.04图形界面下不能从root用户直接登录的问题
- Java采用readInt()方法直接读取特定的ZIP压缩文件出现了奇怪的问题
- 通达OA 关于直接在数据库中修改工作流表单值的问题
- 关于C#中的DateTime类型的细节问题
- 关于EF中直接执行sql语句的参数化问题
- 关于浏览器页面直接调用本地exe和java代码调用本地exe问题
- 关于sql条件语句where id in (@参数)执行报错问题(转换成数据类型 int 时失败)(
- 关于存储过程不直接返回结果集的问题
- 关于mysql的一些安全细节问题
- 经得起雷劈:关于double和int/long相互转换失去精度计算错误的问题
- 关于php的几个细节性问题
- 关于隐藏元素的细节问题。更为稳妥的布局
- 关于VSAN 6.x版本里一个针对SSD性能不足时的写入保护导致强行Unmount VSAN磁盘问题