java 里面的流输出的时候是big endian还是little endian?
我是javaer.
java里面的OutputStream和DataOutputStream,我测试了一下,看了他们输出了整数的文件,用16进制查看后,发现是big endian,如short类型的122,输出为00 7a,又查了资料说,java里面默认就是Big endian,但是为什么tcp连接的时候,项目报文里面的有些整数字段还是要显式地转换才能作为网络字节序呢?java不是默认big endian,本身就是字节序了!
背景是,我现在公司做的项目,都是处理一些接口,看了接口文档中的说明,发现明确规定有些字段,例如报文长度,要求用网络字节序.
然后,就用了类似DataOutputStream中writeByte,writeShort,writeInt,writeLong之类的方法,来转换整数,那么现在的问题是,java中的流,各式各样的流,是big endian还是little endian呢?
SocketOutputStream,就是从socket中用getOutputStream获得流,这是个默认权限的类,只能同一个包才能访问,我们平常用的时候都是用它的父类OutputStream来引用它,这个流是不是就是little endian?如果不是,那么为什么用它发送报文的时候,需要显式的把某些整数转换成网络字节序?
大神们,各抒己见,来给新人讲解一下吧?我也是奇怪,我测试了,inputStream和DataOutputStream输出的文件,都是big endian,为什么输出流的SocketOutputStream,却要显式地转换整数位网络字节序?
alphabet927
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(14)
那个用父类的引用会出问题是LZ你想多了,大端和小端终究还是由这个流对象自己决定的,并不会随着你的引用类型变化
引用来自“ice_stream”的评论
java是默认是Big endian。C是little endian.
往往报文协议的设计者都是c背景,所以报文会要求little endian,为了保证“远端”程序能正常工作,你需要将发出的字节流转换为协议要求的字节序,接收时也要转回来.
补充:这样描述可能并不一定正确,只是为了好理解。
大端
简单理解:int是Java中的简单类型对象(包含对象描述和对象所对应的数据),而byte[]就已经是二进制数据了。
不知道也很正常.
你将那些 英文单词,换成 Unicode , ascii, iso-8859-1 。。等等,应该就有很多人回复了。。
big endian ... 表示不知是什么东西。。
那是你们公司的风格. 一般情况下我会使用byteBuffer,指定order.到最后再生成byte[],os.write(byte[])
引用来自“ice_stream”的评论
java是默认是Big endian。C是little endian.
往往报文协议的设计者都是c背景,所以报文会要求little endian,为了保证“远端”程序能正常工作,你需要将发出的字节流转换为协议要求的字节序,接收时也要转回来.
为什么没有人回答,我用cheat engine,不会看内存!
召唤神龙,大侠,奥特曼,数码宝贝,神灯.
高大上
java里面的确都是大端.
java是默认是Big endian。C是little endian.
往往报文协议的设计者都是c背景,所以报文会要求little endian,为了保证“远端”程序能正常工作,你需要将发出的字节流转换为协议要求的字节序,接收时也要转回来.