【问题标题】:String.getBytes("UTF-32") returns different results on JVM and Dalvik VMString.getBytes("UTF-32") 在 JVM 和 Dalvik VM 上返回不同的结果
【发布时间】:2012-11-29 15:15:32
【问题描述】:

我有一个 48 个字符的 AES-192 加密密钥,我用它来解密一个加密的数据库。

但是,它告诉我密钥长度无效,所以我记录了 getBytes() 的结果。

当我执行时:

final String string = "346a23652a46392b4d73257c67317e352e3372482177652c";
final byte[] utf32Bytes = string.getBytes("UTF-32");
System.out.println(utf32Bytes.length);

在我的 mac(Java 虚拟机)上使用 BlueJ,我得到 192 作为输出。

但是,当我使用:

Log.d(C.TAG, "Key Length: " + String.valueOf("346a23652a46392b4d73257c67317e352e3372482177652c".getBytes("UTF-32").length));

我得到196 作为输出。

有谁知道为什么会这样,以及 Dalvik 从哪里获得额外的 4 个字节?

【问题讨论】:

  • 为什么不转储字节来查看?
  • @JonSkeet 好主意。我稍后会编辑。
  • 可能是 BOM,00 00 FE FF

标签: java android string jvm dalvik


【解决方案1】:

你应该在两台机器上指定字节序

final byte[] utf32Bytes = string.getBytes("UTF-32BE");

注意"UTF-32BE"是不同的编码,不是特殊的.getBytes参数。它具有固定的字节顺序,不需要 BOM。更多信息:http://www.unicode.org/faq/utf_bom.html#gen6

【讨论】:

  • 为什么会影响 number 个字节?
  • 因为字节顺序指定的 UTF32 不需要 BOM。值得一试。
  • 啊,是的。这就是问题所在。他们现在都显示192。当系统允许时,我会接受。
  • @RaghavSood 或者你可以只使用 24 个字节而不是使用 192 个字节。;)
【解决方案2】:

为什么要用 UTF-32 编码纯十六进制数字。这比它需要的大 8 倍。 :P

String s = "346a23652a46392b4d73257c67317e352e3372482177652c";
byte[] bytes = new BigInteger(s, 16).toByteArray();
String s2 = new BigInteger(1, bytes).toString(16);
System.out.println("Strings match is "+s.equals(s2)+" length "+bytes.length);

打印

Strings match is true length 24

【讨论】:

  • 虽然这更适合我正在做的任务,但@Esailija 的回答对这个问题更准确。也谢谢你!
猜你喜欢
  • 2012-02-01
  • 2011-04-03
  • 2019-06-03
  • 2015-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-27
  • 1970-01-01
相关资源
最近更新 更多