【发布时间】:2011-12-01 15:07:48
【问题描述】:
我需要将字符串转换为字节[]。如果是这样,任务将很简单。我需要用 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# 中带有不同字节数组的字符串示例(而不是来自您的示例代码,它也做了很多其他事情)。否则将关闭。