Rizin
unix-like reverse engineering framework and cli tools
|
Variable-length integer handling. More...
Go to the source code of this file.
Macros | |
#define | LZMA_VLI_MAX (UINT64_MAX / 2) |
Maximum supported value of a variable-length integer. More... | |
#define | LZMA_VLI_UNKNOWN UINT64_MAX |
VLI value to denote that the value is unknown. More... | |
#define | LZMA_VLI_BYTES_MAX 9 |
Maximum supported encoded length of variable length integers. More... | |
#define | LZMA_VLI_C(n) UINT64_C(n) |
VLI constant suffix. More... | |
#define | lzma_vli_is_valid(vli) ((vli) <= LZMA_VLI_MAX || (vli) == LZMA_VLI_UNKNOWN) |
Validate a variable-length integer. More... | |
Typedefs | |
typedef uint64_t | lzma_vli |
Variable-length integer type. More... | |
Functions | |
LZMA_API (lzma_ret) lzma_vli_encode(lzma_vli vli | |
Encode a variable-length integer. More... | |
LZMA_API (uint32_t) lzma_vli_size(lzma_vli vli) lzma_nothrow lzma_attr_pure | |
Get the number of bytes required to encode a VLI. More... | |
Variables | |
size_t * | vli_pos |
size_t uint8_t * | out |
size_t uint8_t size_t * | out_pos |
size_t uint8_t size_t size_t out_size | lzma_nothrow |
size_t const uint8_t * | in |
size_t const uint8_t size_t * | in_pos |
Variable-length integer handling.
In the .xz format, most integers are encoded in a variable-length representation, which is sometimes called little endian base-128 encoding. This saves space when smaller values are more likely than bigger values.
The encoding scheme encodes seven bits to every byte, using minimum number of bytes required to represent the given value. Encodings that use non-minimum number of bytes are invalid, thus every integer has exactly one encoded representation. The maximum number of bits in a VLI is 63, thus the vli argument must be less than or equal to UINT64_MAX / 2. You should use LZMA_VLI_MAX for clarity.
Definition in file vli.h.
#define LZMA_VLI_BYTES_MAX 9 |
#define lzma_vli_is_valid | ( | vli | ) | ((vli) <= LZMA_VLI_MAX || (vli) == LZMA_VLI_UNKNOWN) |
#define LZMA_VLI_MAX (UINT64_MAX / 2) |
#define LZMA_VLI_UNKNOWN UINT64_MAX |
Variable-length integer type.
Valid VLI values are in the range [0, LZMA_VLI_MAX]. Unknown value is indicated with LZMA_VLI_UNKNOWN, which is the maximum value of the underlying integer type.
lzma_vli will be uint64_t for the foreseeable future. If a bigger size is needed in the future, it is guaranteed that 2 * LZMA_VLI_MAX will not overflow lzma_vli. This simplifies integer overflow detection.
LZMA_API | ( | lzma_ret | ) |
Encode a variable-length integer.
Decode a variable-length integer.
This function has two modes: single-call and multi-call. Single-call mode encodes the whole integer at once; it is an error if the output buffer is too small. Multi-call mode saves the position in *vli_pos, and thus it is possible to continue encoding if the buffer becomes full before the whole integer has been encoded.
vli | Integer to be encoded |
vli_pos | How many VLI-encoded bytes have already been written out. When starting to encode a new integer in multi-call mode, *vli_pos must be set to zero. To use single-call encoding, set vli_pos to NULL. |
out | Beginning of the output buffer |
out_pos | The next byte will be written to out[*out_pos]. |
out_size | Size of the out buffer; the first byte into which no data is written to is out[out_size]. |
Single-call (vli_pos == NULL):
Multi-call (vli_pos != NULL):
Like lzma_vli_encode(), this function has single-call and multi-call modes.
vli | Pointer to decoded integer. The decoder will initialize it to zero when *vli_pos == 0, so application isn't required to initialize *vli. |
vli_pos | How many bytes have already been decoded. When starting to decode a new integer in multi-call mode, *vli_pos must be initialized to zero. To use single-call decoding, set vli_pos to NULL. |
in | Beginning of the input buffer |
in_pos | The next byte will be read from in[*in_pos]. |
in_size | Size of the input buffer; the first byte that won't be read is in[in_size]. |
Single-call (vli_pos == NULL):
Multi-call (vli_pos != NULL):
LZMA_API | ( | uint32_t | ) | const |
Get the number of bytes required to encode a VLI.
Get the number of bytes required to encode a VLI.
Run-time version number as an integer.
Get the number of processor cores or threads.
Calculate CRC32.
Although not all Check IDs have a check algorithm associated, the size of every Check is already frozen. This function returns the size (in bytes) of the Check field with the specified Check ID. The values are: { 0, 4, 4, 4, 8, 8, 8, 16, 16, 16, 32, 32, 32, 64, 64, 64 }
If the argument is not in the range [0, 15], UINT32_MAX is returned.
Calculate CRC32 using the polynomial from the IEEE 802.3 standard.
buf | Pointer to the input buffer |
size | Size of the input buffer |
crc | Previously returned CRC value. This is used to calculate the CRC of a big buffer in smaller chunks. Set to zero when starting a new calculation. |
size_t * vli_pos |
Definition at line 115 of file vli.h.
Referenced by LZMA_API().