如何将从sha1 bytearray生成的字符串返回到该bytearray?

时间:2017-03-27 21:05:35

标签: java string bittorrent

首先抱歉英语不好。

好吧,我想从torrent文件中读取片段哈希信息。目前,我正在使用https://github.com/hyPiRion/java-bencode这个bencode库来解码信息,但我的问题是当我想将字符串转换为字节数组时。 torrent文件以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

2 个答案:

答案 0 :(得分:0)

  

我将二进制数据存储为字符串,因为.torrent文件中的BEncode格式,将该二进制数据存储为字符串

Bencode“字符串”是字节序列,而不是unicode代码点的序列。因此,语言在java中的字节表示 - byte[]ByteBuffer是合适的,并且在某些情况下只应被解释为utf8字符串,当它们实际包含应该是人类可读的内容时。

因此,您应该使用支持提取原始字节的bencoding库。

答案 1 :(得分:0)

感谢大家的回答,但我可以使用此https://github.com/bedeho/bencodej

找到解决方案

lib将Bencode数据加载为带有自定义类的bytearray,并且能够与bytestrings一起使用1:1:p 谢谢大家。