java将byte转为无符号字节——解决java没有unsigned byte问题

在使用代码和硬件通讯时,通常碰到c++中使用无符号字节unsigned byte 进行数据发送与接受,但JAVA没有无符号字节,怎么把131(java的字节只能存 -128 ~127 )发送给机器呢,怎么接收机器发过来的131呢?

其实,只要稍作处理应该可以了。只要在发送时,把131用int存,强转为byte, (byte)131, 发送过去即可,c++无符号字节接收到表现回131。在接收时, 接收到的131为负数,只要 把该负数& 0xff用int存即可获得131。
·
原理如下(用255测试,java字节byte存不了255):

import org.junit.Test;
public class JunitTest {

    @Test
    public void unsignedByteTest(){
        /**
         * 测试java如何发超过127的byte给c++接收
         * 原理:java中发送字节255到c++中的unsigned byte接收,255表示为1111 1111 ,在java中符号位1表示负数,负数存的是补码
         * 补码-1再全部取反为原码,所以~(1111 1111 - 1) = 0000 0001,所以java中把-1发给c++的unsigned byte接收就是255了
         * 总结:java发字节255,需要实际发-1(强转为byte)即可
         */
        int input = 255;
        byte send = (byte)input;
        System.out.println(send);

        /**
         * 测试java如何接收超过127的c++无符号字节
         * 原理:java 的byte 接收255,存储为1111 1111 ,java 的字节表示为-1,转回255用int存储即可。直接转为int ,会高位补和符号位一样的数,
         * 即变为1111 1111 1111 1111,这样转为int得到不是255,而是-1,需要与0xff(0000 0000 1111 1111)相与(&),把高位变为0,
         * 得到 0000 0000 1111 1111,再转为int即可得到255
         *
         * 总结:java接受字节255,接受后为-1 , & 0xff后即可还原为255
         */
         byte javaReceive = (byte) 255;  //c++发过来的255,java中接收到为-1
         int out = javaReceive;  //直接强转int得到-1,不是255
         int expected = javaReceive & 0xff; // 得到255,期待的结果
         System.out.println(out);
         System.out.println(expected);
    }
 }   

测试结果:

 

 

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值