gpt4 book ai didi

java - 此 Java 和 C 代码之间的区别?

转载 作者:太空宇宙 更新时间:2023-11-04 01:12:51 25 4
gpt4 key购买 nike

我试图将一些 C 代码转换为 Java,但它的工作方式略有不同。它是 XOR 加密,对于某些数据,它返回相同的结果,所以我知道它非常接近,但对于某些数据,它的工作方式并不完全相同(不同的结果)。

C 代码(在 x86 Windows 上运行,使用 Borland Builder 编译):

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 字节,如果需要,我可能会弄清楚如何作为附件发布,但我认为不是。

最佳答案

我猜这是因为 char 在 java 中是 16 位的。因此,当您增加 key key[crypt_ptr] += (char) 1 或添加两个字符 key[crypt_ptr] += key[crypt_ptr + 1] 时,它的作用不同来自 c 的方式(其中 char 是 8 位)。

尝试到处使用字节而不是字符,只需使用符号代码进行初始化。

关于java - 此 Java 和 C 代码之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8125210/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com