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

zsx10110 发布于 2015/03/14 22:00
阅读 3K+
收藏 0
如图 就是我要接受的数据 开始4个字节为消息的长度,后面的4个字节是消息的类型,后面就是消息的内容

现在我必须要先读取到消息的类型接着做消息的处理这个是我接受消息的方法
Java code
?
1
2
3
4
5
6
7
   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取代了,求高手帮忙解释下 到底是什么原因
加载中
0
vvtf
vvtf

String ret = "";

for(int i = 0, len = bytebuf.length; i < len; i ++) {

String hex =  Integer.toHexString(bytebuf[i] & 0xff).toUpperCase();

ret += hex.length()  == 1 ? "0" + hex : hex;

}

0
Xsank
Xsank

通过new String(buffer)获取的字符串在decode时默认使用“UTF-8”编码

那个fa在无法转换,会被UTF-8转换为缺失字符EF BF BD

zsx10110
zsx10110
那请问我要用什么编码方式转换呢。
0
zsx10110
zsx10110

引用来自“Royh-L”的评论

String ret = "";

for(int i = 0, len = bytebuf.length; i < len; i ++) {

String hex =  Integer.toHexString(bytebuf[i] & 0xff).toUpperCase();

ret += hex.length()  == 1 ? "0" + hex : hex;

}

能解释下 这个是什么意思吗
0
zsx10110
zsx10110

引用来自“Royh-L”的评论

String ret = "";

for(int i = 0, len = bytebuf.length; i < len; i ++) {

String hex =  Integer.toHexString(bytebuf[i] & 0xff).toUpperCase();

ret += hex.length()  == 1 ? "0" + hex : hex;

}

用了下 发现真的没问题了,大神求解释。。
0
vvtf
vvtf

byte就是一个字节啊

然后使用Integer.toHexString使用十六进制显示,因为int不是一个字节,所以要&0xff。

tohexstring的参数是一个int,而一个byte只有8位,所以不够int的长度就是进行补码。

但是一个以1(二进制)开头的byte,会是一个负数进行补码,那样数据是不对的,所以要取一个字节长度&0xff.

返回顶部
顶部