【问题标题】:String to byte[] - c# act like java [duplicate]字符串到字节 [] - c# 像 java [重复]
【发布时间】:2011-12-01 15:07:48
【问题描述】:

可能重复:
.NET String to byte Array C#

我需要将字符串转换为字节[]。如果是这样,任务将很简单。我需要用 C# 编写它,但我需要它像 Java 一样工作。

我看到了两个问题:

Endianness:Java 在内部将事物存储为 Big Endian,而 .NET 默认为 Little Endian。

有符号性:C# 字节是无符号的。 Java 字节已签名。

如何获取一个 UTF-8 字符串,并获得一个与 Java 中匹配的字节[]。

为了提供更多上下文,我有这两个函数(一个在 java 中,一个在 c# 中),它们创建不同的哈希值,我怀疑这是由于 .net 与 java 中字节表示的不同。 爪哇:

String key = "test";
String data = "test";
String algorithm = "HmacSHA1";
Charset charset = Charset.forName("utf-8");
SecretKeySpec signingKey = new SecretKeySpec(key.getBytes(), algorithm);
Mac mac = Mac.getInstance(algorithm);
mac.init(signingKey);
return new String(Base64.encodeBase64(mac.doFinal(data.getBytes(charset))), charset);

C#:

string key = "ed2ee2e0-65c1-11de-8a39-0800200c9a66";
string data = "test";
byte[] aKey = Encoding.UTF8.GetBytes(key);
byte[] aData = Encoding.UTF8.GetBytes(data);
HMACSHA1 oEncode = new HMACSHA1(aKey);
byte[] aBytes = oEncode.ComputeHash(aData);
return Convert.ToBase64String(aBytes);

【问题讨论】:

  • 它们是有符号还是无符号并不重要,这只是对相同位进行不同解释的问题。它会影响除法、乘法和右移(仅此而已),但您可以先将它们转换为sbyte
  • @harold - 所以如果我需要将字符串转换为 byte[],并且我的 java 代码和 c# 代码需要提供相同的 byte[],这有什么关系呢?如果您使用有符号字节和无符号字节,字节 [] 会不会有所不同?
  • @Donut - 我真的希望它这么简单。这不是因为问题中所述的原因 - 在 c# vs java 中,相同的字符串出现在两个不同的 byte[] 中。
  • 不,它们将是相同的。它们在调试器中看起来会有所不同,但位是相同的。如果有差异,则不是由于签名。您可以通过将它们投射到sbytes 来使它们看起来相同,并检查它们是否看起来相同。
  • aepheus,请提供一个在 Java 和 C# 中带有不同字节数组的字符串示例(而不是来自您的示例代码,它也做了很多其他事情)。否则将关闭。

标签: c# java string bytearray


【解决方案1】:

只需使用:

byte[] bytes = Encoding.UTF8.GetBytes("SomeString");

但有一些注意事项:

  1. .NET 中没有“UTF-8”字符串这样的东西:所有字符串都是 Unicode (UCS-2)。
  2. 没有大端/小端字节顺序 在 UTF-8 中,字节的顺序由格式定义。查看 RFC-2279 了解详情。

为什么要关心字节是否签名?

【讨论】:

    【解决方案2】:

    如上所述,字节字节序的行为完全相同。有符号与无符号在这里也不是一个真正的因素。

    就用这个吧:

    byte[] bytes = Encoding.UTF8.GetBytes("my string");
    

    你应该没事的。

    如果您解释为什么您需要除此案之外的其他东西,我可能会提供进一步的帮助。

    【讨论】:

      【解决方案3】:

      自从我在异类环境中比赛以来已经有一段时间了,但我不相信签名和未签名应该会产生巨大的差异。如果我是正确的,那么数组的顺序是个大问题。

      有两种解决方案(可能的解决方案?):

      1. 在 .NET 中使用 Array.Reverse() 翻转数组
      2. use little endian in Java

      两者都应该解决排序问题。

      【讨论】:

      • 在字符串上反转只会按照它所说的那样 - 反转字符串。作者错误地认为字节具有字节顺序,但实际上并没有。
      • 字节本身不是,当它们代表一个字符串时。
      • 我认为他认为多字节字符具有字节顺序而不是字节本身。
      猜你喜欢
      • 2016-03-09
      • 2016-03-28
      • 2017-06-15
      • 1970-01-01
      • 2019-02-22
      • 2017-09-21
      • 2017-02-02
      • 1970-01-01
      • 2018-05-01
      相关资源
      最近更新 更多