README.md

# TLV

Provides functions to decode, encode and work with ASN.1 BER-TLV structures. It supports tags encoded on multiple
bytes, length encoded on multiple bytes, indefinite length and both primitive and constructed TLVs.

## Installation
Add tlv to your list of dependencies in `mix.exs`:
```elixir
def deps do
  [{:tlv, "~> 0.0.1"}]
end
```
## Examples

### Decoding TLVs
```elixir
# Primitive TLV + data after its end
iex> TLV.decode(<<0x80, 0x02, 0xCA, 0xFE, 0xAA, 0xBB>>)
{%TLV{indefinite_length: false, tag: 0x80, value: <<0xCA, 0xFE>>}, <<0xAA, 0xBB>>}

# Constructed TLV
iex> TLV.decode(<<0xE0, 0x03, 0x80, 0x01, 0xAA>>)
  {%TLV{indefinite_length: false, tag: 0xE0, value:
    [%TLV{indefinite_length: false, tag: 0x80, value: <<0xAA>>}]
  }, ""}

# Malformed TLV
iex> TLV.decode(<<0x80, 0x02, 0x00>>)
:no_tlv
```

### Encoding TLVs
```elixir
# Primitive TLV
iex> TLV.encode(%TLV{tag: 0x80, value: <<0xAA, 0xBB>>})
<<0x80, 0x02, 0xAA, 0xBB>>

# Constructed TLV
iex> TLV.encode(%TLV{tag: 0xE0, value: [%TLV{tag: 0x80, value: <<0xAA>>}]})
<<0xE0, 0x03, 0x80, 0x01, 0xAA>>
```