我有一些无法更改的Java代码。我正在尝试将Java代码的输出与某些C#代码进行匹配。 Java代码中的密码通过Base64.getDecoder().decode
生成。一些输出的Java带有负数,但是C#代码中没有得到任何负数。
我有一些Java代码:
String plaintextsalt = salt;
byte[] plainsalt = plaintextsalt.getBytes(StandardCharsets.UTF_8);
// The output from plainsalt is : [107, 104, 99, 101, 67, 82, 101, 115, 72, 54, 102, 106, 114, 86, 100, 122]
byte[] data = (Base64.getDecoder().decode(plainsalt));
// The output from data is : [-110, 23, 30, 9, 23, -84, 31, -89, -29, -83, 87, 115]
虽然我的C#代码产生了:
String plaintextsalt = salt;
byte[] byteplainsalt = System.Text.Encoding.UTF8.GetBytes(plaintextsalt);
// The output from byteplainsalt is : [107, 104, 99, 101, 67, 82, 101, 115, 72, 54, 102, 106, 114, 86, 100, 122]
byte[] data = Convert.FromBase64String(System.Text.Encoding.UTF8.GetString(plainsalt));
//output from data: [146, 23, 30, 9, 23, 172, 31, 167, 227, 173, 87, 115]
答案 0 :(得分:2)
byte
是无符号的,因此不能为负。我不知道Java,但看来byte
已签名。以下代码将为您提供来自Java的相同输出。它将字节转换为有符号字节:
sbyte[] data = Convert.FromBase64String(System.Text.Encoding.UTF8.GetString(byteplainsalt)).Select(x=>(sbyte)x).ToArray();
还请注意,您是将字符串转换为byte[]
,然后又转换回字符串,因此可以直接使用该字符串:
sbyte[] data = Convert.FromBase64String(plaintextsalt).Select(x=>(sbyte)x).ToArray();
答案 1 :(得分:1)
Java默认情况下具有签名字节。在C#中,字节被认为是无符号的。在Java中,127
以上的任何值都将为负。如果需要带符号的字节,则需要将数组转换为sbyte
,例如:
var random = new Random();
var bytes = new byte[100];
var sbytes = new sbyte[bytes.Length];
random.NextBytes(bytes);
for(int i = 0; i < bytes.Length; i++)
{
sbytes[i] = (sbyte)bytes[i];
}