java 里面的流输出的时候是big endian还是little endian?

李嘉图 发布于 2015/08/24 20:34
阅读 2K+
收藏 1

我是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

加载中
0
i
ice_stream

java是默认是Big endian。C是little endian.

往往报文协议的设计者都是c背景,所以报文会要求little endian,为了保证“远端”程序能正常工作,你需要将发出的字节流转换为协议要求的字节序,接收时也要转回来.



李嘉图
李嘉图
java里面的确都是大端.
0
0
李嘉图
李嘉图
召唤神龙,大侠,奥特曼,数码宝贝,神灯.
0
李嘉图
李嘉图
为什么没有人回答,我用cheat engine,不会看内存!
0
李嘉图
李嘉图

引用来自“ice_stream”的评论

java是默认是Big endian。C是little endian.

往往报文协议的设计者都是c背景,所以报文会要求little endian,为了保证“远端”程序能正常工作,你需要将发出的字节流转换为协议要求的字节序,接收时也要转回来.



既然java默认是big endian,那为什么我们公司发送报文的时候还要显式的把表示包体长度的int,转换成为big endian的byte[],而不是直接输出(我问了,直接输出会错).
_
_Yud
那是你们公司的风格. 一般情况下我会使用byteBuffer,指定order.到最后再生成byte[],os.write(byte[])
0
东胜神洲
东胜神洲

你将那些 英文单词,换成 Unicode , ascii, iso-8859-1 。。等等,应该就有很多人回复了。。

big endian ... 表示不知是什么东西。。


李嘉图
李嘉图
不知道也很正常.
0
zigzagroad
zigzagroad
简单理解:int是Java中的简单类型对象(包含对象描述和对象所对应的数据),而byte[]就已经是二进制数据了。
zigzagroad
zigzagroad
补充:这样描述可能并不一定正确,只是为了好理解。
0
chunquedong
chunquedong

引用来自“ice_stream”的评论

java是默认是Big endian。C是little endian.

往往报文协议的设计者都是c背景,所以报文会要求little endian,为了保证“远端”程序能正常工作,你需要将发出的字节流转换为协议要求的字节序,接收时也要转回来.



楼上胡说。于C语言没关系,是CPU和操作系统决定的。Java为了处理方便才统一为Big endian。

0
张亦俊
张亦俊
那个用父类的引用会出问题是LZ你想多了,大端和小端终究还是由这个流对象自己决定的,并不会随着你的引用类型变化
返回顶部
顶部