无符号与有符号类型的转换

本文介绍了在将C++程序移植到Java时遇到的无符号与有符号类型转换问题。由于Java不支持无符号类型,这导致在处理字节流时需要特别注意数据范围的转换。文章通过CRC32函数的移植举例,说明了如何避免因类型转换导致的错误,并强调了测试数据选择的重要性。

   最近做了一个从windows平台用c++实现的程序移植到android平台用java语言实现的一个通讯程序,由于平台语言都有差别,加之本人之前没有接触过android和java,为了完成任务中间颇费了一番周折,在周围同事都没有做过的情况下,自己也就现学现卖了。先将移植过程中比较细的不容易被发现的问题拎出来,后续完整的将整个移植思路,移植步骤记录下来,算是对整个过程的一个回顾和总结。本次就谈谈类型转换带来的麻烦。

  java语言没有无符号数据类型。大家都知道通讯程序是传输字节流,而c++中是无符号字节,java是有符号字节,两者所表示的数域是不一样的,前者[0,255],后者[-128,127],这样在通过接口捞数据时,当接收到一个字节时,java需要用大于字节的数域存储c++传过来的一个字节,中间还要做个转换,切掉大于0xff的数域,代码如此:intJava = c++Byte &0xff;千万不能直接 byteJava = c++Byte,如果后续再拿byteJava作比较或者算术运算就会出现问题,至于为什么,大家体会一下,简单的正数就变负数了。倒是后续如果一直是二进制运算的话不会有问题,这又是为何?大家仔细想想。

  java语言没有无符号类型,在移植过程中,CRC32函数的计算最开始也遇到了问题,描述如下:


  c++中的CRC32:


uint32_t __fastcall CRC32(uint32_t *Data, uint32_t Len)
{
 uint8_t i;

 uint32_t crc = 0xFFFFFFFF;
 
 for(uint32_t i=0;i<Len;i++)
 {
  uint32_t temp = Data[i];

  for(uint32_t j=0; j<32; j++)
  {
   if( (crc ^ temp) & 0x80000000 )
   {
    crc = 0x04C11DB7 ^ (crc<<1);
   }else
   {
    crc <<=1;
   }

   temp<<=1;
        }
 }

 return crc;
}


开始我在java中如此移植该函数:

//   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值