开发者社区> 问答> 正文

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

如图  就是我要接受的数据 开始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取代了,求高手帮忙解释下 到底是什么原因

展开
收起
kun坤 2020-06-06 23:40:54 682 0
1 条回答
写回答
取消 提交回答
  • 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

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

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

    2020-06-06 23:40:59
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载