0

我正在开发带有 HSM 模块集成的 TCP/IP 应用程序。我的 JAVA 代码在 Windows 32 位/JRE 32 位/IBM Websphere 7 中运行良好,当我升级到 RedHat Linux-64 位/JRE 64 位/IBM webshere 8 时,如果我发送低于 127 长度的字符串运行良好,但超过 127 它正在返回响应。我也做了一些编码技术,但面对同样的 pblm 请指导我。

如果 commandLength = 小于 127,工作正常,但大于 127 [UTF-8 编码失败] 所以对于超过 127,我使用扩展 ascii,但它在 [UTF-8]/working 中不起作用在 windows-1252 中很好 //hsmMessage.insert(0, (char)commandLength);

         char[] extended_ascii = new char[1];           
         byte cp437bytes[]= new byte[1];                
         cp437bytes[0] = (byte) commandLength;      
         extended_ascii = new String(cp437bytes).toCharArray();     //extended_ascii = new String(cp437bytes, "CP437").toCharArray();
         hsmMessage.insert(0, extended_ascii);

谢谢

4

1 回答 1

0

永远不要使用String对象来保存任意二进制数据 - 使用byte数组或其包装器。

原因是当从字节数组转换为字符串时,给定的语言环境用于将字节转换为字符对象,这在许多情况下最终会导致字符串不包含您认为应该包含的确切字节,尤其是对于字节值 > = 128。

多年前,我在编写的 RADIUS 服务器中遇到了非常相似的问题。它适用于绝大多数密码,但如果用户密码中有一个£符号,US-ASCII 和 UK-ASCII 之间的差异会导致底层字节值被破坏,从而导致计算错误的加密密码,并且失败登录。

于 2015-10-19T13:01:52.630 回答