我的问题是关于C#和Java的。
我想从以下链接解密像C#的方法d67这样的字节数组:https://github.com/AresChat/cb0t/blob/master/cb0t/Misc/Hashlink.cs
我将其翻译为Java:
private static byte[] d67(byte[] data, int b)
{
byte[] buffer = new byte[data.length];
System.arraycopy(data, 0, buffer, 0, data.length);
for (int i = 0; i < data.length; i++)
{
buffer[i] = (byte)(data[i] ^ b >> 8 & 255);
b = (b + data[i]) * 23219 + 36126 & 65535;
}
return buffer;
}
但是它给我的结果与C#方法不同。
我翻译错了什么?
我用C#得到的结果:
public static void Main()
{
string str = "F5fPxdTq8eJeuqSVejGmq7aTh6BJZ8J0jgt92MDDjxTIWf+mWa8Ld+01L2bVIV6FXhCO";
byte[] val2 = Convert.FromBase64String(str);
val2 = d67(val2, 28435);
Console.WriteLine("Converted byte value: {0}", BitConverter.ToString(val2));
}
private static byte[] d67(byte[] data, int b)
{
byte[] buffer = new byte[data.Length];
Array.Copy(data, buffer, data.Length);
for (int i = 0; i < data.Length; i++)
{
buffer[i] = (byte)(data[i] ^ b >> 8 & 255);
b = (b + data[i]) * 23219 + 36126 & 65535;
}
return buffer;
}
是: 78-9C-63-60-C0-04-CE-1E-8E-21-40-EC-E7-E7-EA-C3-60-A6-76-C9-DC-F0-0A-48-D4- D7-31-D2-3F-C8-35-58-C1-C5-55-C1-D8-40-C7-C4-40-C7-D4-80-81-01-00-F3-11-09- F1
我期望Java能够达到相同的结果:
public static void main(String[] args)
{
String encodedString = "arlnk://F5fPxdTq8eJeuqSVejGmq7aTh6BJZ8J0jgt92MDDjxTIWf+mWa8Ld+01L2bVIV6FXhCO";
encodedString = encodedString.substring(8);
Base64.Decoder decoder = Base64.getDecoder();
byte[] decodedByteArray = decoder.decode(encodedString);
decodedByteArray = d67(decodedByteArray, 28435);
String array = "";
for (int f=0; f<decodedByteArray.length; f++) {
if (f == decodedByteArray.length - 1) {
array = array + String.format("%02X", decodedByteArray[f]);
}
else {
array = array + String.format("%02X", decodedByteArray[f]) + "-";
}
}
System.out.print(array);
}
private static byte[] d67(byte[] data, int b)
{
byte[] buffer = new byte[data.length];
System.arraycopy(data, 0, buffer, 0, data.length);
for (int i = 0; i < data.length; i++)
{
buffer[i] = (byte)(data[i] ^ b >> 8 & 255);
b = (b + data[i]) * 23219 + 36126 & 65535;
}
return buffer;
}
答案 0 :(得分:0)
@khelwood观测byte
的类型在两种语言中都是不同的。
您可以将有符号转换为无符号。
将带符号字节转换为无符号字节后,其结果与.Net相同
private static byte[] d67(byte[] data, int b) {
byte[] buffer = new byte[data.length];
System.arraycopy(data, 0, buffer, 0, data.length);
for (int i = 0; i < data.length; i++) {
int unsignedData = unsignedToBytes(data[i]);
buffer[i] = (byte) (unsignedData ^ b >> 8 & 255);
b = (b + unsignedData) * 23219 + 36126 & 65535;
}
return buffer;
}
public static int unsignedToBytes(byte b) {
return b & 0xFF;
}