最近做了一个从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中如此移植该函数:
//