【发布时间】:2017-03-27 21:05:34
【问题描述】:
首先抱歉英语不好。
好吧,我想从一个 torrent 文件中读取碎片散列信息。目前,我正在使用https://github.com/hyPiRion/java-bencode 这个 bencode 库来解码信息,但我的问题是当我想将字符串转换为字节数组时。 种子文件以 UTF-8 编码。但是如果我这样做了
Byte[] bytepieces = piecestring.getBytes("UTF-8");
效果很好。任何真正有用的东西。
另一方面,为了比较或尝试获取字符串,而不是获取字节,我已经读取了我的文件的第一部分,并计算了 sha1。在获得 sha1 的 20 大小字节数组后,如果我将其转换为字符串,有效地,该字符串匹配大字符串的第一部分......但是,如果我尝试将生成的字符串返回到最初的 20 个字节创造了它......我不能......怎么做?
小例子:
FileInputStream fin = new FileInputStream("miFile");
byte[] array = new Byte[512*1024]; //a piece of 512 kb
fin.read(array,0,512*1024);
MessageDigest md = MessageDigest.getInstanse ("SHA);
Byte [ sha1byte = md.digest(array);
String s = new String(sha1byte,"UTF-8");
执行此操作后,sha1byte.length 为 20,并且是正确的 sha1 哈希大小。但如果我这样做
s.getBytes("UTF-8").length, in the case of my example i got... ¡33! ¡wuuut! 我想再次从生成的字符串中获取我的 20 个数组。我怎样才能得到这个?
谢谢 :P
【问题讨论】:
-
你为什么首先将二进制数据转换为字符串?字符串不是二进制数据的容器。
-
如果您想以文本形式呈现/存储二进制数据,请使用Base-64 编码,而不是UTF-8 字符集。在 Java 8 中,使用
java.util.Base64。 -
旁白:查看the documentation for
InputStream.read。您会注意到,即使尚未到达流的末尾,也不需要完全填充给定的数组。这里是some alternatives that are guaranteed to read the entire stream。 -
我将二进制数据存储为字符串,因为 .torrent 文件中的 BEncode 格式将该二进制数据存储为字符串。我想将该字符串转换为哈希字节数组。我知道base64,但文件格式为UTF-8。我拥有的另一个选项是逐字节重新读取所有 .torrent 文件,但为此我必须重写所有库。
标签: java string bittorrent