如何在C#和Java中获得相同的byte []

时间:2016-05-24 10:43:10

标签: java c# bytearray aes

TLDR: Java 已签名,c#未签名Byte[]值不同,如何解决这个问题。如何将任何一方转换为另一方?

值为"Hello World" MD5哈希值,然后转换为bytes

爪哇:

-79, 10, -115, -79, 100, -32, 117, 65, 5, -73, -87, -101, -25, 46, 63, -27

C#:

177, 10, 141, 177, 100, 224, 117, 65, 5, 183, 169, 155, 231, 46, 63, 229

我使用byte[]双方使用AES进行加密,但密码绝不匹配。

2 个答案:

答案 0 :(得分:7)

字节具有相同的值,它们的打印方式不同。

如果您想确保具有负值的字节显示为正数,请添加256并取模256,如下所示:

for (byte b : byteArray) {
    int n = (b + 256) % 256;
    System.out.println(n);
}

同样,如果您希望将值高于128的值放入正确的字节范围内,可以将它们转换为截断高位字节并获取负值,或者如果您愿意,可以减去256:

for (int n : byteValuesAsInt) {
    byte b1 = (byte)n;
    byte b2 = n >= 128 ? n-256 : n;
}

答案 1 :(得分:3)

Java使用签名的字节,而C#使用 unsinged 。要比较字符串,让我们将Java表示转换为C#one:

  String java = 
    "-79, 10, -115, -79, 100, -32, 117, 65, 5, -73, -87, -101, -25, 46, 63, -27";

  String cs = String.Join(", ", java
    .Split(',')
    .Select(c => int.Parse(c))
    .Select(x => x < 0 ? 256 + x: x));

 // 177, 10, 141, 177, 100, 224, 117, 65, 5, 183, 169, 155, 231, 46, 63, 229
 Console.Write(cs);

如您所见,字符串现在相等

编辑:如果您已获得java string ,并且您希望拥有C#byte[]

 byte[] cs = java
   .Split(',')
   .Select(c => int.Parse(c))
   .Select(x => (byte) (x < 0 ? 256 + x: x)))
   .ToArray();