我在Java中有一些使用
的代码String.getBytes()
(没有编码参数)在某个生成的字符串上获取byte[]
,我后来将其用作AES加密的密钥。
然后我接受编码消息并在C#(WP7 / WP8环境)下我需要解码它。
我可以轻松生成我在Java应用程序中使用的字符串,但是我需要将其转换为byte[]
,以便生成与Java中完全相同的字节数组。
问题1: 我可以不改变Java代码吗?
问题2:
如果没有,我应该如何实现这两个版本,以便它们总是返回相同的byte[]
,无论如何?
答案 0 :(得分:6)
基本上,您应该在Java代码中指定编码。目前,您的代码将在不同系统上生成不同的输出,因为它使用平台默认编码(例如Windows-1252或UTF-8)。
我鼓励你在两种情况下使用UTF-8:
// Java 7 onwards
byte[] bytes = text.getBytes(StandardCharsets.UTF_8);
// Java pre-7
byte[] bytes = text.getBytes("UTF-8");
// .NET
byte[] bytes = Encoding.UTF8.GetBytes(text);
使用UTF-8可以将所有有效的Unicode字符串编码为字节。您可以考虑使用UTF-16,但是您需要确保在每种情况下指定相同的字节序。这样做的好处是每个char
只有两个字节,不管内容如何(因为char
是Java和.NET中的UTF-16代码单元)。