Java Base64.getDecoder()。decode()c#等效

时间:2019-03-18 19:13:18

标签: java c#

我有一些无法更改的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]

2 个答案:

答案 0 :(得分:2)

C#中的

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];
}