diff --git a/lib/bencode.ex b/lib/bencode.ex index 036a3f6..07e2cb3 100644 --- a/lib/bencode.ex +++ b/lib/bencode.ex @@ -104,7 +104,7 @@ defmodule Bencode do int = num |> Integer.parse |> elem(0) offset = String.length(num) + 1 - tail = binary_part(rest, offset, byte_size(rest) - offset) + tail = String.slice rest, offset, String.length(rest) - offset {int, tail} end @@ -114,11 +114,11 @@ defmodule Bencode do int = size |> Integer.parse |> elem(0) prefix = String.length(size) + 1 - - string = binary_part(data, prefix, int) + + string = String.slice data, prefix, int offset = prefix + int - tail = binary_part(data, offset, byte_size(data) - offset) + tail = String.slice data, offset, String.length(data) - offset {string, tail} end @@ -151,7 +151,7 @@ defmodule Bencode do def encode!(data) when is_map(data), do: Enum.reduce(data, "d", &(&2 <> encode!(&1))) <> "e" def encode!(data) when is_atom(data), do: data |> Atom.to_string |> encode! def encode!({k, v}), do: encode!(k) <> encode!(v) - def encode!(data), do: (data |> byte_size |> Integer.to_string) <> ":" <> data + def encode!(data), do: (data |> String.length |> Integer.to_string) <> ":" <> data @doc """ Encode Elixir data structures to a Bencode bitstring. diff --git a/test/bencode_test.exs b/test/bencode_test.exs index e0e4f28..f2290a4 100644 --- a/test/bencode_test.exs +++ b/test/bencode_test.exs @@ -38,6 +38,10 @@ defmodule BencodeTest do test "Decode empty string with faulty tail" do assert {:error, :trailing_data} === decode("0:test") end + + test "Decode unicode string" do + assert {:ok, "exposé"} === decode("6:exposé") + end test "Decode invalid integer" do assert {:error, :invalid_format} === decode("i2") @@ -110,7 +114,7 @@ defmodule BencodeTest do test "Decode map with tail" do assert {:error, :trailing_data} === decode("dei") end - + test "encode integer" do assert "i42e" === encode!(42) end @@ -118,6 +122,10 @@ defmodule BencodeTest do test "encode string" do assert "4:spam" === encode!("spam") end + + test "encode unicode string" do + assert "6:exposé" === encode!("exposé") + end test "encode atom" do assert "4:spam" === encode!(:spam)