【问题标题】:How to return a string generated from a sha1 bytearray to that bytearray?如何将从 sha1 字节数组生成的字符串返回到该字节数组?
【发布时间】: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


【解决方案1】:

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

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

所以你应该使用支持原始字节提取的编码库。

【讨论】:

  • 是的,是这个主意,但是... ¿witch 图书馆可以做到这一点吗?我已经使用各种库进行了测试,但大多数都将信息提取为等效类型,例如 long、list、dict 和字符串。我链接的库让您将元素提取为对象,但使用 byteOutput 和 ObjectWriter 将对象传递给 byteArray,但不能正常工作。 u.u
  • 索取图书馆推荐在 SO 上是题外话
【解决方案2】:

感谢大家的回答,但我可以使用 https://github.com/bedeho/bencodej 找到解决方案

该库始终将 Bencode 数据加载为带有自定义类的字节数组,并且能够与字节串具有 1:1 的比例:p 谢谢大家。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-01
    • 1970-01-01
    • 2015-05-24
    • 2011-10-04
    • 1970-01-01
    • 2012-02-24
    相关资源
    最近更新 更多