From 6a9064d03dfb9f199fa2c763cc453d474974c58e Mon Sep 17 00:00:00 2001 From: Valentin Haenel Date: Mon, 12 Mar 2018 20:49:55 +0100 Subject: [PATCH] code and tests for decoding the flag in the blosc header --- bloscpack/constants.py | 7 +++++++ bloscpack/headers.py | 10 ++++++++++ test/test_headers.py | 30 ++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+) diff --git a/bloscpack/constants.py b/bloscpack/constants.py index 0ff14947..4ca9e915 100644 --- a/bloscpack/constants.py +++ b/bloscpack/constants.py @@ -37,3 +37,10 @@ # Codecs available from Blosc CNAME_AVAIL = blosc.compressor_list() +CNAME_MAPPING = { + 0: 'blosclz', + 1: 'lz4', + 2: 'snappy', + 3: 'zlib', + 4: 'zstd', +} diff --git a/bloscpack/headers.py b/bloscpack/headers.py index 1f980421..e1e7ec58 100644 --- a/bloscpack/headers.py +++ b/bloscpack/headers.py @@ -27,6 +27,7 @@ MAX_CLEVEL, BLOSCPACK_HEADER_LENGTH, MAX_META_SIZE, + CNAME_MAPPING, ) from .defaults import (DEFAULT_OFFSETS, ) @@ -220,6 +221,15 @@ def decode_blosc_header(buffer_): ('ctbytes', decode_uint32(buffer_[12:16])))) +def decode_blosc_flags(byte_): + return OrderedDict((('byte_shuffle', bool(byte_ & 1)), + ('pure_memcpy', bool(byte_ >> 1 & 1)), + ('bit_shuffle', bool(byte_ >> 2 & 1)), + ('split_blocks', bool(byte_ >> 4 & 1)), + ('codec', CNAME_MAPPING[byte_ >> 5 & 7]), + )) + + class BloscpackHeader(MutableMappingObject): """ The Bloscpack header. diff --git a/test/test_headers.py b/test/test_headers.py index 21c9d626..81879320 100644 --- a/test/test_headers.py +++ b/test/test_headers.py @@ -15,6 +15,7 @@ from bloscpack.args import (BloscArgs, ) +from bloscpack.compat_util import OrderedDict from bloscpack.constants import (MAGIC, FORMAT_VERSION, MAX_FORMAT_VERSION, @@ -33,6 +34,7 @@ decode_metadata_options, check_range, decode_blosc_header, + decode_blosc_flags, ) @@ -191,6 +193,34 @@ def test_decode_blosc_header_uncompressible_data_dont_split_false(): nt.assert_equal(expected, header) +def test_decode_blosc_flags(): + + def gen_expected(new): + it = OrderedDict(( + ('byte_shuffle', False), + ('pure_memcpy', False), + ('bit_shuffle', False), + ('split_blocks', False), + ('codec', 'blosclz'), + )) + it.update(new) + return it + for input_byte, new_params in [ + (0b00000000, {}), + (0b00000001, {'byte_shuffle': True}), + (0b00000010, {'pure_memcpy': True}), + (0b00000100, {'bit_shuffle': True}), + (0b00010000, {'split_blocks': True}), + (0b00100000, {'codec': 'lz4'}), + (0b01000000, {'codec': 'snappy'}), + (0b01100000, {'codec': 'zlib'}), + (0b10000000, {'codec': 'zstd'}), + ]: + yield (nt.assert_equal, + decode_blosc_flags(input_byte), + gen_expected(new_params)) + + def test_BloscPackHeader_constructor_exceptions(): # uses nose test generators