我試圖將一些C代碼轉換爲Java,但它的工作方式稍有不同。這是XOR加密,對於某些數據它返回相同的結果,所以我知道它非常接近,但對於某些數據,它不能完全相同(不同的結果)。此Java和C代碼之間的區別?
C代碼(在x86 Windows中,與Borland生成器編譯後運行):
void Crypt(unsigned char *data,long len)
{
char key[] = "X02$B:";
ULONG crypt_ptr;
long x;
for(crypt_ptr=0,x=0;x<len;x++)
{
data[x] ^= key[crypt_ptr];
if(crypt_ptr < (sizeof(key) - 2))
key[crypt_ptr] += key[crypt_ptr + 1];
else
key[crypt_ptr] += key[0];
if(!key[crypt_ptr])
key[crypt_ptr] += (char) 1;
if(++crypt_ptr >= sizeof(key) - 1)
crypt_ptr = 0;
}
}
的Java代碼(它運行,如果它的事項在Android平臺上):
public static void Crypt(byte[] data,int offset,int len)
{
// EDIT: Changing this to byte[] instead of char[] seems to have fixed code
//char[] key = {'X','0','2','$','B',':'};
byte[] key = {'X','0','2','$','B',':'};
int size_of_key = 7;
int crypt_ptr;
int x;
for(crypt_ptr=0,x=0;x<len;x++)
{
data[x+offset] ^= key[crypt_ptr];
if(crypt_ptr < (size_of_key - 2))
key[crypt_ptr] += key[crypt_ptr + 1];
else
key[crypt_ptr] += key[0];
if(key[crypt_ptr] == 0)
key[crypt_ptr] += (char) 1;
if(++crypt_ptr >= size_of_key - 1)
crypt_ptr = 0;
}
}
我已經證實,進入每個函數的數據是相同的,而對於Java版本,我在字節數組中傳遞正確的偏移值。如前所述,它有時會起作用,所以我認爲這不是一個主要/顯而易見的問題,更像是有符號值和無符號值之間的一些小問題。如果它有幫助,那麼第一個不同的字節就是數據中的第125個字節(索引爲124,如果從零開始)。我沒有看到一個模式,就像每125個字節一樣,它之後幾乎是隨機的。數據只有171字節,我可以根據需要找出如何作爲附件發佈,但我不認爲它是。
這是這個問題的更新:http://stackoverflow.com/questions/8098383/need-help-converting-c-code-to-java? – home
在Java代碼中聲明'int size_of_key = key.length;' –
是更好的樣式是的,這是對我其他帖子的更新。它已經關閉了,所以我認爲我需要開始一個新的(併發佈一個更好的問題,而不是要求別人去做我的工作;)?我想我會改變爲size_of_key = key.length建議,但我會使用+1,因爲在C sizeof()包括空終止符。 – eselk