【问题标题】:How to get identical byte[] in C# and Java如何在 C# 和 Java 中获得相同的字节 []
【发布时间】:2016-05-24 10:43:09
【问题描述】:

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

值是 "Hello World" MD5 散列然后转换为 bytes

Java:

-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进行加密,但密码永远不匹配。

【问题讨论】:

  • 值没有不同。它们的表示方式不同。您可以确定位完全相同。
  • 我的哈希匹配,我的字节不匹配。我在那篇帖子中没有看到任何有用的信息。
  • 我的帖子针对的是 Sarathy,对不起 Kayaman。
  • @user5581557,这是错误的。如果你在用 Java 解密文件时遇到问题,那不是因为 Java 使用有符号字节。

标签: java c# bytearray aes


【解决方案1】:

字节具有相同的值,只是打印方式不同。

如果您想确保具有负值的字节显示为正数,请添加 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;
}

【讨论】:

  • 我的目标不是查看字节,而是使用它们。在 Java 中,我无法将值插入到 byte[] 中,因为它是无符号的。
  • 当然可以。只需将它们转换为一个字节。它是否以负数结尾并不相关 - 字节表示是相同的。
  • 能否请您展示一个“向下转换为一个字节”的示例。
【解决方案2】:

Java 使用 signed 字节,而 C# 使用 unsinged 字节。为了比较 strings,让我们将 Java 表示转换为 C#:

  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();

【讨论】:

  • 好的,这很完美,但是如何在一个以 byte[] 作为参数的函数中使用该字符串(结果)?例如:解密(字节[],字节[])
  • @user5581557:如果给你 Java string(因为 Java 结果中有负值,你不能在 C# 中直接使用 byte[])你可以通过 Linq 将其转换为 c# byte[](参见我的编辑)
猜你喜欢
  • 2018-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-18
  • 1970-01-01
  • 1970-01-01
  • 2020-12-16
相关资源
最近更新 更多