5
回答
关于socket通信接受byte数组问题
华为云4核8G,高性能云服务器,免费试用   
如图 就是我要接受的数据 开始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取代了,求高手帮忙解释下 到底是什么原因
举报
zsx10110
发帖于3年前 5回/3K+阅
共有5个答案 最后回答: 3年前

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;

}

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

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

--- 共有 1 条评论 ---
zsx10110那请问我要用什么编码方式转换呢。 3年前 回复

引用来自“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;

}

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

引用来自“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;

}

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

byte就是一个字节啊

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

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

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

顶部