Code Bye

关于socket通信接受byte数组问题

如图 就是我要接受的数据 开始4个字节为消息的长度,后面的4个字节是消息的类型,后面就是消息的内容

现在我必须要先读取到消息的类型接着做消息的处理这个是我接受消息的

   byte bytebuf[] = new byte[1024];
                    int len = dateInput.read(bytebuf);

                    if(len!=-1){
                        String mStr = new String(bytebuf);
                        System.out.println("十六进制数"+str2HexStr(mStr));
                    }

打印出来的结果是

前面的FA被EF BF BD取代了,求高手帮忙解释下 到底是什么原因

就没有大神帮帮忙吗

30分
用DataInputStream,先readInt读取四个字节的消息长度,然后再readInt读取四个字节的消息类型,然后根据消息的长度构造一个byte数组,然后readFully这个数组就哦了…

10分
问题应该在你new string的时候,出现了编码错误,这个默认编码里边不含前面8个字节的文字,所以默认变为?之类的东西,然后你再把string改为byte数组的时候,字节数据已经发生了变化。本来就是不是string的东西,最好不要 new string(***)出来
引用 2 楼 u012809889 的回复:

用DataInputStream,先readInt读取四个字节的消息长度,然后再readInt读取四个字节的消息类型,然后根据消息的长度构造一个byte数组,然后readFully这个数组就哦了…

尝试先用readInt读取4个字节 可是读出来的Int是正确的..

引用 2 楼 u012809889 的回复:

用DataInputStream,先readInt读取四个字节的消息长度,然后再readInt读取四个字节的消息类型,然后根据消息的长度构造一个byte数组,然后readFully这个数组就哦了…

尝试先用readInt读取4个字节 可是读出来的Int是不正确的..

问题解决了,采用一个byte一个byte的读取 就可以了,接着再将4个byte组合起来因为Int读取的话会有个高位地位的区别所以读取Int才可能不太正确,这个是我的猜想。
感谢了。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于socket通信接受byte数组问题