字符串到字节 [] - c# 像 java [重复]
Posted
技术标签:
【中文标题】字符串到字节 [] - c# 像 java [重复]【英文标题】:String to byte[] - c# act like java [duplicate] 【发布时间】: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[] 中。
不,它们将是相同的。它们在调试器中看起来会有所不同,但位是相同的。如果有差异,则不是由于签名。您可以通过将它们投射到sbyte
s 来使它们看起来相同,并检查它们是否看起来相同。
aepheus,请提供一个在 Java 和 C# 中带有不同字节数组的字符串示例(而不是来自您的示例代码,它也做了很多其他事情)。否则将关闭。
【参考方案1】:
只需使用:
byte[] bytes = Encoding.UTF8.GetBytes("SomeString");
但有一些注意事项:
-
.NET 中没有“UTF-8”字符串这样的东西:所有字符串都是
Unicode (UCS-2)。
没有大端/小端字节顺序
在 UTF-8 中,字节的顺序由格式定义。查看
RFC-2279 了解详情。
为什么要关心字节是否签名?
【讨论】:
【参考方案2】:如上所述,字节字节序的行为完全相同。有符号与无符号在这里也不是一个真正的因素。
就用这个吧:
byte[] bytes = Encoding.UTF8.GetBytes("my string");
你应该没事的。
如果您解释为什么您需要除此案之外的其他东西,我可能会提供进一步的帮助。
【讨论】:
【参考方案3】:自从我在异类环境中比赛以来已经有一段时间了,但我不相信签名和未签名应该会产生巨大的差异。如果我是正确的,那么数组的顺序是个大问题。
有两种解决方案(可能的解决方案?):
-
在 .NET 中使用 Array.Reverse() 翻转数组
use little endian in Java
两者都应该解决排序问题。
【讨论】:
在字符串上反转只会按照它所说的那样 - 反转字符串。作者错误地认为字节具有字节顺序,但实际上并没有。 字节本身不是,当它们代表一个字符串时。 我认为他认为多字节字符具有字节顺序而不是字节本身。以上是关于字符串到字节 [] - c# 像 java [重复]的主要内容,如果未能解决你的问题,请参考以下文章
字节 [] 到 C# .NET Core 中的字符串 [重复]
为啥c#中bool要占4个字节 32位呢 为啥不用像byte 1个字节存储呢