字符串到字节 [] - 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[] 中。 不,它们将是相同的。它们在调试器中看起来会有所不同,但位是相同的。如果有差异,则不是由于签名。您可以通过将它们投射到sbytes 来使它们看起来相同,并检查它们是否看起来相同。 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# [重复]

从字符串文本框到十六进制 0x 字节 [] c# [重复]

字节 [] 到 C# .NET Core 中的字符串 [重复]

为啥c#中bool要占4个字节 32位呢 为啥不用像byte 1个字节存储呢

在 C# 中有效地将字符串转换为字节数组(不使用编码)[重复]

在java中将字符串数组元素转换为字节数组[重复]