【问题标题】:NSData to Java StringNSData 到 Java 字符串
【发布时间】:2010-09-23 01:45:42
【问题描述】:

我最近一直在编写一个与 iPhone 交互的 Web 应用程序。 iPhone iphone实际上会以plist的形式向服务器发送信息。所以看到类似的东西并不少见......

<key>RandomData</key>
<data>UW31vrxbUTl07PaDRDEln3EWTLojFFmsm7YuRAscirI=</data>

现在我知道这些数据以某种方式进行了散列/加密。当我用编辑器(属性列表编辑器)打开 plist 时,它向我展示了一种更“人类可读”的格式。例如,上面的数据会被转换成...

<346df5da 3c5b5259 74ecf683 4431249f 711630ba 232c54ac 9bf2ee44 0r1c8ab2>

知道转换它的方法是什么吗?主要是我想把它变成一个 Java 字符串。

谢谢!

【问题讨论】:

    标签: java objective-c cocoa string nsdata


    【解决方案1】:

    根据wikipedia 的朋友的说法,&lt;data&gt; 标签包含Base64 encoded 数据。因此,请使用您最喜欢的 Java“Base64”类进行解码(另请参阅 this question)。

    ps。从技术上讲,这既不是“散列”也不是“加密”,只是“编码”。 “散列”意味着一种单向转换,其中多个输入值可以产生相同的输出值。 “加密”意味着需要一个(通常是秘密的)“密钥”来反转加密。 Base64 编码只是一种仅使用可打印字符来表示任意二进制数据的方法。

    【讨论】:

      【解决方案2】:

      base64 解码后,您需要对其进行十六进制编码。这就是 PL Editor 向您展示的内容。

      所以...

      <key>SomeData</key>
      <data>UW31ejxbelle7PaeRAEen3EWMLojbFmsm7LuRAscirI=</data?
      

      可以用...表示

      byte[] bytes = Base64.decode("UW31ejxbelle7PaeRAEen3EWMLojbFmsm7LuRAscirI=");
      BigInteger bigInt = new BigInteger(bytes);
      String hexString = bigInt.toString(16);
      System.out.println(hexString);
      

      为了得到……

      <516df5aa 3c5b5259 74ecf683 4401259f 711630ba 236c59ac 9bb2ee44 0b1c8ab2>
      

      【讨论】:

      • 我的十六进制转换器不是最好的,但想法是一样的。
      • 这段代码切断了任何前导零......关于如何防止这种情况的任何想法?
      • @Bashorings:通过循环手动打印 bytes 数组中的每个数字,或者使用像 javax.xml.bind.DatatypeConverter.printHexBinary 这样为您执行此操作的 API
      猜你喜欢
      • 1970-01-01
      • 2012-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-15
      • 1970-01-01
      • 1970-01-01
      • 2011-02-08
      相关资源
      最近更新 更多