2012-01-18 51 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不要求任何特定的右移操作。

相關問題