# Entropic --- ## Entropic - Easily Convert Rust Structures To/From Unstructured Bytes The `Entropic` trait enables the conversion of raw bytes into Rust data structures and back. ## Mapping to/from unstructured bytes `entropic` srives to provide a few guarantees about the way it maps data: **1. Every data structure value will be mapped to by one or more unstructured byte sequences.** In mathematical terms, this means that the function from unstructured bytes to data structures is _surjective_. It's not uncommon for multiple different unstructured byte sequences to map to the same data structure value, so it should not be assumed that a different byte input will lead to different output. Some data structure values may have a slightly greater chance of being chosen than others due to this surjective mapping. Certain schemes provide guaranteed bounds on the probability delta between different values, and the `PureRandomScheme` aims to provide cryptographically-secure guarantees on each resulting output value having identical odds of occuring given an input; however, these guarantees come at the cost of consuming much more entropy input bytes on average than other schemes. **2. Data structures will map to unstructured bytes that always map back to that same data structure.** In mathematical terms, suppose `U` is the set of all possible unstructured byte sequences and `S` is the set of all possible data structure values. `entropic` provides two functions (`from_entropy_source` and `to_entropy_sink`) that can respectively be represented by `f: U -> S` and `g: S -> U`. For every value `s` in `S`, entropic aims to guarantee that `f(g(s)) == s`. _However_, it is _not_ the case that `g(f(u)) == u` for all `u` in `U`--several byte sequences may map to the same data structure value, but that value can only map back to one of those sequences. This property is particularly useful when using `entropic` for fuzzing data structures. Fuzzing has been shown to be much more effective across domains when provided with semantically-valid starting seeds that explore interesting paths. As such, `entropic` allows one to define an expected data structure and convert it to a byte sequence that will subsequently map to that same structure during fuzzing. ## Improvements over other libraries - Allows converting back into unstructured bytes in a (semi-)bijective manner - Guarantees formation of data structure so long as sufficient data is available, regardless of bytes. Other crates (such as `arbitrary`) require certain structure within raw input (such as syntactically valid UTF-8 for strings) to succeed - Modular entropy conversion scheme--if you would rather have data map in a different way, you can choose what entropy scheme maps data into structures, or even implement your own mapping!