bencode icon indicating copy to clipboard operation
bencode copied to clipboard

Cannot read nested array in bencode

Open Kineolyan opened this issue 4 years ago • 2 comments

From a bencode input "li1ei2el3:stree", I get [1 2 [#object["[B" 0x5351baec "[B@5351baec"]]] Note: the input was created using write-bencode and seems correct with respect to the spec

Reproducing code:

(ns b
  (:require [bencode.core :as b]))

(defn bread
  [content]
  (-> (.getBytes content "UTF-8")
      java.io.ByteArrayInputStream.
      java.io.PushbackInputStream.
      b/read-bencode))

(bread "li1ei2el3:stree")

I am using version from babashka 0.6.4, so I guess this is the latest.

Kineolyan avatar Nov 07 '21 20:11 Kineolyan

A quick check showed that this is not an issue for nested maps.

Kineolyan avatar Nov 07 '21 20:11 Kineolyan

So, after investigating this issue, I found some magic performed in the test: the function <bytes. As I understand it, it transforms the raw bytes that were decoded into beautiful UTF-8 strings. As I am writing this, it seems completely legit, because the string can have any charset.

Though I just discovered this library, I would say that converting every byte-array to an original string form is quite common. I would gladly appreciate a nice utility function to convert all those bytes to string, using a custom function. I see that it applies to both bencode and netstring. What do you think?

https://github.com/nrepl/bencode/blob/4286ceef3cc7e9531b8e1650d0a1ff243b150dcd/test/bencode/core_test.clj#L23-L41

Kineolyan avatar Nov 09 '21 21:11 Kineolyan