2012-01-18 140 views
0

我试图模仿Java中旧的传统C程序行为。 C代码是:如何在java中使用unsigned int/char值

void calc_crc(unsigned char *datbuff,unsigned int length) 
{ 
static unsigned char tmp; 
static unsigned int crc,zaehler; 
crc = 0; 
for (zaehler = 0;zaehler < length ;zaehler ++) 
{ 
tmp=(unsigned char) (crc>>8) ; 
crc=(crc<<8)^crctab[tmp]^*datbuff; 
datbuff++; 
} 
} 

static unsigned short crctab[256] = 
{ // Some values 
}; 

第一个问题是这段代码使用unsigned在java签名的地方。努力保留这些价值。 我们可以在java中获得相同的结果吗?

回答

2

最简单的方法是始终至少使用一个大小。即C使用char的地方,你使用short或int。在这种情况下,需要更多的值来控制它们,但这可以通过屏蔽大部分来处理。

较长的答案是您可以对签名变量执行相同的操作,但可以转换所有值。另外,要非常小心你在java中的变化,确保使用>>>,否则你只会迷惑自己。 >>是一个有符号的右移,>>>是无符号的。大多数情况下,如果您确保使用正确的大小变量和正确的移位操作符,您的代码可能会正常工作。

2

您可以使用下一个较高整数类型(long代替int,..)并正确屏蔽输入。 8byte的值更加复杂 - 通常你必须在这种情况下使用BigInteger - 虽然有时你可以使用带符号的数字和一些技巧,这取决于操作,移位和异或工作很好地独立于符号位。

但问题是给定的代码不能“模仿”,因为它是实现定义的。 unsigned int可能是2,4或8个字节 - 请选择并且C不要求任何特定的右移操作。

相关问题