Skip to main content

Library to handle sparse bytes within a virtual memory space

Project description

docs

Documentation Status

tests

GitHub Actions Status
Coverage Status

package

PyPI Package latest release PyPI Wheel
Supported versions
Supported implementations

Library to handle sparse bytes within a virtual memory space.

  • Free software: BSD 2-Clause License

Objectives

This library aims to provide utilities to work with a virtual memory, which consists of a virtual addressing space where sparse chunks of data can be stored.

In order to be easy to use, its interface should be close to that of a bytearray, which is the closest pythonic way to store dynamic data. The main downside of a bytearray is that it requires a contiguous data allocation starting from address 0. This is not good when sparse data have to be stored, such as when emulating the addressing space of a generic microcontroller.

The main idea is to provide a bytearray-like class with the possibility to internally hold the sparse blocks of data. A block is ideally a tuple (start, data) where start is the start address and data is the container of data items (e.g. bytearray). The length of the block is len(data). Those blocks are usually not overlapping nor contiguous, and sorted by start address.

Python implementation

This library is the Cython complement to the Python implementation provided by the bytesparse Python package. Please refer to its own documentation for more details.

The bytesparse package provides the following virtual memory types:

  • bytesparse.Memory, a generic virtual memory with infinite address range.

  • bytesparse.bytesparse, a subclass behaving more like bytearray.

All the implementations inherit the behavior of collections.abc.MutableSequence and collections.abc.MutableMapping. Please refer to the collections.abc reference manual for more information about the interface API methods and capabilities.

Cython implementation

The library provides an experimental Cython implementation. It tries to mimic the same algorithms of the Python implementation, while exploiting the speedup of compiled C code.

Beware that the Cython implementation is meant to be potentially faster than the pure Python one, but there might be even faster ad-hoc implementations of virtual memory highly optimized for the underlying hardware.

The addressing space is limited to that of an uint_fast64_t, so it is not possible to have an infinite addressing space, nor negative addresses. To keep the implementation code simple enough, the highest address (i.e. 0xFFFFFFFFFFFFFFFF) is reserved.

Block data chunks cannot be greater than the maximum ssize_t value (typically half of the addressing space).

The Cython implementation is optional, and potentially useful only when the Python implementation seems too slow for the user’s algorithms, within the limits stated above.

If in doubt about using the Cython implementation, just stick with the Python one, which is much easier to integrate and debug.

More details can be found within cbytesparse.c.

Examples

Here’s a quick usage example of bytesparse objects:

>>> from cbytesparse import Memory
>>> from cbytesparse import bytesparse
>>> # ----------------------------------------------------------------
>>> m = bytesparse(b'Hello, World!')  # creates from bytes
>>> len(m)  # total length
13
>>> str(m)  # string representation, with bounds and data blocks
"<[[0, b'Hello, World!']]>"
>>> bytes(m)  # exports as bytes
b'Hello, World!'
>>> m.to_bytes()  # exports the whole range as bytes
b'Hello, World!'
>>> # ----------------------------------------------------------------
>>> m.extend(b'!!')  # more emphasis!!!
>>> bytes(m)
b'Hello, World!!!'
>>> # ----------------------------------------------------------------
>>> i = m.index(b',')  # gets the address of the comma
>>> m[:i] = b'Ciao'  # replaces 'Hello' with 'Ciao'
>>> bytes(m)
b'Ciao, World!!!'
>>> # ----------------------------------------------------------------
>>> i = m.index(b',')  # gets the address of the comma
>>> m.insert(i, b'ne')  # inserts 'ne' to make 'Ciaone' ("big ciao")
>>> bytes(m)
b'Ciaone, World!!!'
>>> # ----------------------------------------------------------------
>>> i = m.index(b',')  # gets the address of the comma
>>> m[(i - 2):i] = b' ciao'  # makes 'Ciaone' --> 'Ciao ciao'
>>> bytes(m)
b'Ciao ciao, World!!!'
>>> # ----------------------------------------------------------------
>>> m.pop()  # less emphasis --> 33 == ord('!')
33
>>> bytes(m)
b'Ciao ciao, World!!'
>>> # ----------------------------------------------------------------
>>> del m[m.index(b'l')]  # makes 'World' --> 'Word'
>>> bytes(m)
b'Ciao ciao, Word!!'
>>> # ----------------------------------------------------------------
>>> m.popitem()  # less emphasis --> pops 33 (== '!') at address 16
(16, 33)
>>> bytes(m)
b'Ciao ciao, Word!'
>>> # ----------------------------------------------------------------
>>> m.remove(b' ciao')  # self-explanatory
>>> bytes(m)
b'Ciao, Word!'
>>> # ----------------------------------------------------------------
>>> i = m.index(b',')  # gets the address of the comma
>>> m.clear(start=i, endex=(i + 2))  # makes empty space between the words
>>> m.to_blocks()  # exports as data block list
[[0, b'Ciao'], [6, b'Word!']]
>>> m.contiguous  # multiple data blocks (emptiness inbetween)
False
>>> m.content_parts  # two data blocks
2
>>> m.content_size  # excluding emptiness
9
>>> len(m)  # including emptiness
11
>>> # ----------------------------------------------------------------
>>> m.flood(pattern=b'.')  # replaces emptiness with dots
>>> bytes(m)
b'Ciao..Word!'
>>> m[-2]  # 100 == ord('d')
100
>>> # ----------------------------------------------------------------
>>> m.peek(-2)  # 100 == ord('d')
100
>>> m.poke(-2, b'k')  # makes 'Word' --> 'Work'
>>> bytes(m)
b'Ciao..Work!'
>>> # ----------------------------------------------------------------
>>> m.crop(start=m.index(b'W'))  # keeps 'Work!'
>>> m.to_blocks()
[[6, b'Work!']]
>>> m.span  # address range of the whole memory
(6, 11)
>>> m.start, m.endex  # same as above
(6, 11)
>>> # ----------------------------------------------------------------
>>> m.bound_span = (2, 10)  # sets memory address bounds
>>> str(m)
"<2, [[6, b'Work']], 10>"
>>> m.to_blocks()
[[6, b'Work']]
>>> # ----------------------------------------------------------------
>>> m.shift(-6)  # shifts to the left; NOTE: address bounds will cut 2 bytes!
>>> m.to_blocks()
[[2, b'rk']]
>>> str(m)
"<2, [[2, b'rk']], 10>"
>>> # ----------------------------------------------------------------
>>> a = bytesparse(b'Ma')
>>> a.write(0, m)  # writes [2, b'rk'] --> 'Mark'
>>> a.to_blocks()
[[0, b'Mark']]
>>> # ----------------------------------------------------------------
>>> b = Memory.from_bytes(b'ing', offset=4)
>>> b.to_blocks()
[[4, b'ing']]
>>> # ----------------------------------------------------------------
>>> a.write(0, b)  # writes [4, b'ing'] --> 'Marking'
>>> a.to_blocks()
[[0, b'Marking']]
>>> # ----------------------------------------------------------------
>>> a.reserve(4, 2)  # inserts 2 empty bytes after 'Mark'
>>> a.to_blocks()
[[0, b'Mark'], [6, b'ing']]
>>> # ----------------------------------------------------------------
>>> a.write(4, b'et')  # --> 'Marketing'
>>> a.to_blocks()
[[0, b'Marketing']]
>>> # ----------------------------------------------------------------
>>> a.fill(1, -1, b'*')  # fills asterisks between the first and last letters
>>> a.to_blocks()
[[0, b'M*******g']]
>>> # ----------------------------------------------------------------
>>> v = a.view(1, -1)  # creates a memory view spanning the asterisks
>>> v[::2] = b'1234'  # replaces even asterisks with numbers
>>> a.to_blocks()
[[0, b'M1*2*3*4g']]
>>> a.count(b'*')  # counts all the asterisks
3
>>> v.release()  # release memory view
>>> # ----------------------------------------------------------------
>>> c = a.copy()  # creates a (deep) copy
>>> c == a
True
>>> c is a
False
>>> # ----------------------------------------------------------------
>>> del a[a.index(b'*')::2]  # deletes every other byte from the first asterisk
>>> a.to_blocks()
[[0, b'M1234']]
>>> # ----------------------------------------------------------------
>>> a.shift(3)  # moves away from the trivial 0 index
>>> a.to_blocks()
[[3, b'M1234']]
>>> list(a.keys())
[3, 4, 5, 6, 7]
>>> list(a.values())
[77, 49, 50, 51, 52]
>>> list(a.items())
[(3, 77), (4, 49), (5, 50), (6, 51), (7, 52)]
>>> # ----------------------------------------------------------------
>>> c.to_blocks()  # reminder
[[0, b'M1*2*3*4g']]
>>> c[2::2] = None  # clears (empties) every other byte from the first asterisk
>>> c.to_blocks()
[[0, b'M1'], [3, b'2'], [5, b'3'], [7, b'4']]
>>> list(c.intervals())  # lists all the block ranges
[(0, 2), (3, 4), (5, 6), (7, 8)]
>>> list(c.gaps())  # lists all the empty ranges
[(None, 0), (2, 3), (4, 5), (6, 7), (8, None)]
>>> # ----------------------------------------------------------------
>>> c.flood(pattern=b'xy')  # fills empty spaces
>>> c.to_blocks()
[[0, b'M1x2x3x4']]
>>> # ----------------------------------------------------------------
>>> t = c.cut(c.index(b'1'), c.index(b'3'))  # cuts an inner slice
>>> t.to_blocks()
[[1, b'1x2x']]
>>> c.to_blocks()
[[0, b'M'], [5, b'3x4']]
>>> t.bound_span  # address bounds of the slice (automatically activated)
(1, 5)
>>> # ----------------------------------------------------------------
>>> k = bytesparse.from_blocks([[4, b'ABC'], [9, b'xy']], start=2, endex=15)  # bounded
>>> str(k)  # shows summary
"<2, [[4, b'ABC'], [9, b'xy']], 15>"
>>> k.bound_span  # defined at creation
(2, 15)
>>> k.span  # superseded by bounds
(2, 15)
>>> k.content_span  # actual content span (min/max addresses)
(4, 11)
>>> len(k)  # superseded by bounds
13
>>> k.content_size  # actual content size
5
>>> # ----------------------------------------------------------------
>>> k.flood(pattern=b'.')  # floods between span
>>> k.to_blocks()
[[2, b'..ABC..xy....']]

Documentation

For the full documentation, please refer to:

https://cbytesparse.readthedocs.io/

Installation

From PyPI (might not be the latest version found on github):

$ pip install cbytesparse

From the source code root directory:

$ pip install .

Development

To run the all the tests:

$ pip install tox
$ tox

To regenerate the Cython files manually, run the following commands:

$ python scripts/cython_build_src.py
$ python scripts/cython_build_tests.py

or alternatively:

$ tox -e cythonize

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cbytesparse-0.0.6.tar.gz (1.0 MB view details)

Uploaded Source

Built Distributions

cbytesparse-0.0.6-cp311-cp311-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.11 Windows x86-64

cbytesparse-0.0.6-cp311-cp311-musllinux_1_1_x86_64.whl (3.6 MB view details)

Uploaded CPython 3.11 musllinux: musl 1.1+ x86-64

cbytesparse-0.0.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.7 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

cbytesparse-0.0.6-cp311-cp311-macosx_10_9_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.11 macOS 10.9+ x86-64

cbytesparse-0.0.6-cp310-cp310-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.10 Windows x86-64

cbytesparse-0.0.6-cp310-cp310-musllinux_1_1_x86_64.whl (3.6 MB view details)

Uploaded CPython 3.10 musllinux: musl 1.1+ x86-64

cbytesparse-0.0.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.5 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

cbytesparse-0.0.6-cp310-cp310-macosx_10_9_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.10 macOS 10.9+ x86-64

cbytesparse-0.0.6-cp39-cp39-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.9 Windows x86-64

cbytesparse-0.0.6-cp39-cp39-musllinux_1_1_x86_64.whl (3.6 MB view details)

Uploaded CPython 3.9 musllinux: musl 1.1+ x86-64

cbytesparse-0.0.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.6 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

cbytesparse-0.0.6-cp39-cp39-macosx_10_9_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.9 macOS 10.9+ x86-64

cbytesparse-0.0.6-cp38-cp38-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.8 Windows x86-64

cbytesparse-0.0.6-cp38-cp38-musllinux_1_1_x86_64.whl (3.7 MB view details)

Uploaded CPython 3.8 musllinux: musl 1.1+ x86-64

cbytesparse-0.0.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.6 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

cbytesparse-0.0.6-cp38-cp38-macosx_10_9_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.8 macOS 10.9+ x86-64

cbytesparse-0.0.6-cp37-cp37m-win_amd64.whl (1.2 MB view details)

Uploaded CPython 3.7m Windows x86-64

cbytesparse-0.0.6-cp37-cp37m-musllinux_1_1_x86_64.whl (3.4 MB view details)

Uploaded CPython 3.7m musllinux: musl 1.1+ x86-64

cbytesparse-0.0.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.3 MB view details)

Uploaded CPython 3.7m manylinux: glibc 2.17+ x86-64

cbytesparse-0.0.6-cp37-cp37m-macosx_10_9_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.7m macOS 10.9+ x86-64

File details

Details for the file cbytesparse-0.0.6.tar.gz.

File metadata

  • Download URL: cbytesparse-0.0.6.tar.gz
  • Upload date:
  • Size: 1.0 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.0

File hashes

Hashes for cbytesparse-0.0.6.tar.gz
Algorithm Hash digest
SHA256 a27bad3908681ab53c4b47057b0f5fa0bb145f3246de9f4c5f91c026363a0950
MD5 703a27c36484763ae21229aa494b64c3
BLAKE2b-256 064c592594fde7e408e82acbf2543bc7a9cec874d83c658796ad12ede67696a6

See more details on using hashes here.

File details

Details for the file cbytesparse-0.0.6-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for cbytesparse-0.0.6-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 a1521c80d0f9beb28b3c933494b0824d39d65437f1c682278f13a182256f3fe3
MD5 ac2a69764031d62e4ebfc174645a306f
BLAKE2b-256 aee88cd37067c73e02bb797aeeb139c6010c4d62161a946a9c9fe6c2ff080650

See more details on using hashes here.

File details

Details for the file cbytesparse-0.0.6-cp311-cp311-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for cbytesparse-0.0.6-cp311-cp311-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 c9b17b62c359238dd8b8e562dee36a0fa7f9056e79ec6b319f78a5e99db27d11
MD5 a0f73293747293d202cfd163564a0c7e
BLAKE2b-256 092faff595e450e04c0ab8a7f59de3564ced49948339e6fa54cb8378640cded1

See more details on using hashes here.

File details

Details for the file cbytesparse-0.0.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cbytesparse-0.0.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ebd728bdd2c38b91b8281a373e7a339eb2b5c96ebde2d81c62fc202361e04ac0
MD5 3cc4745982baefcefaf4c0d57adb7a04
BLAKE2b-256 02aabec2fa3ed179ab873a72217ffd66bd10b3273143c941ed8a6491e9dd5ac0

See more details on using hashes here.

File details

Details for the file cbytesparse-0.0.6-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for cbytesparse-0.0.6-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 8f4ad5f91bc69e1636b6a691269f0d8e9f767bf36acd629eb6ddcd5ac0a3aa46
MD5 f1aeaf8139718424e5a6966bcecdc5d7
BLAKE2b-256 5c63b06f07b036a702f8abac9bb380b72511277a2d231b53149680c7f697361f

See more details on using hashes here.

File details

Details for the file cbytesparse-0.0.6-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for cbytesparse-0.0.6-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 1355a5b917ea5e1ba1099e328d1ba2ee41645ccdfdb5bf569a51f4a7058d121d
MD5 7747e5260a200f12d134cc582e4e1fb3
BLAKE2b-256 4e2695165484d99d34a95cef662c8ea10cfab41add39cf3049eaa4d509ea24a2

See more details on using hashes here.

File details

Details for the file cbytesparse-0.0.6-cp310-cp310-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for cbytesparse-0.0.6-cp310-cp310-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 1382948da797d19e8158cdd39dfbcfd1f573f6fb7e89e36c18867cee0f95ee8c
MD5 4a4b2ec80b46011bdbaa9153b01360a2
BLAKE2b-256 4ec57b6c0590b4e5a4c3ac7526008ed212dba4663aae97275cd99c9bb5af862f

See more details on using hashes here.

File details

Details for the file cbytesparse-0.0.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cbytesparse-0.0.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e1840f9212ec48ed3cd5596442f8255906329365652cb0dcf9b498883e93def0
MD5 fd1230bd44e8ac4214c0e10ee156f686
BLAKE2b-256 3abac616bf3649cab7be0ba94fbed2040d91caee70c9dec5a068be51f5cdd0b7

See more details on using hashes here.

File details

Details for the file cbytesparse-0.0.6-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for cbytesparse-0.0.6-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 4bf69dd17bd7ca11a154aa5397562baa795fc2342ef25a05c89fe4e99b3bb25b
MD5 a7d724c10235cd33296330abc3f0150c
BLAKE2b-256 cc5b991ece4de033bfd8b311dfac49ba37b102503e4edaa259108c0a9cdd37e6

See more details on using hashes here.

File details

Details for the file cbytesparse-0.0.6-cp39-cp39-win_amd64.whl.

File metadata

File hashes

Hashes for cbytesparse-0.0.6-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 78b4f2fdb512eb3e84cdd06c773a581404d5d8a36cb6cca1263f6cfe0469ef4c
MD5 bff4d656e0413b03b87d7832c0431505
BLAKE2b-256 b274f3c61789f0726f9d226e19b643ca592696a40cb05bdb4cad3e5cc937d5fb

See more details on using hashes here.

File details

Details for the file cbytesparse-0.0.6-cp39-cp39-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for cbytesparse-0.0.6-cp39-cp39-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 66f31a47dc947f4858f4032e0bdee6c2855448df999acaad717df6a51caeb5d6
MD5 90825f45e93bef4631b09900e0efd13e
BLAKE2b-256 e02abbfde3c7b315de6b9c861f15d7ce07d9f17c9506924faa49263827968008

See more details on using hashes here.

File details

Details for the file cbytesparse-0.0.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cbytesparse-0.0.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 28f2e1966288c2f5bc28bac93ff88eede26d83aa52c2d16261c637aefd45d7bb
MD5 91fce67c98b7431988280c82644270f3
BLAKE2b-256 ca405ba90b32705c1bd4fe6cf4c1954884e832331e6f7bdf388d237c19bc2d1a

See more details on using hashes here.

File details

Details for the file cbytesparse-0.0.6-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for cbytesparse-0.0.6-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 0bb07d98499e3452f2ecef063c3a3ce007a2737639664579f5df67dfa6fd07d3
MD5 207abae8650f98adb3f3f14ef84df86f
BLAKE2b-256 5cdfb20c2a68cb58ebc05cd2a234d616d9dea8ce0827ec50b5dd405f16944d6b

See more details on using hashes here.

File details

Details for the file cbytesparse-0.0.6-cp38-cp38-win_amd64.whl.

File metadata

File hashes

Hashes for cbytesparse-0.0.6-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 8648cd86a8eb631ceca55cfd02db2aa63ccaa5de0336fa7e2dc48c149dedcf4f
MD5 8c87514c0b878f5b6ff47bb421bc04aa
BLAKE2b-256 8a616e4c59d9a7beb3f9ee33be3cc9878452173cc06f60fbfddc616e0e46e50c

See more details on using hashes here.

File details

Details for the file cbytesparse-0.0.6-cp38-cp38-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for cbytesparse-0.0.6-cp38-cp38-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 8cc30346e8d50d0bd31fb489e60dec26c683a8ce8f47949940c3145816e2468f
MD5 046129c8166ed239d324e163fe7d4945
BLAKE2b-256 2f597d34944ef45212498eece8a31d15de1091fae2991abed71709e0c71225b5

See more details on using hashes here.

File details

Details for the file cbytesparse-0.0.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cbytesparse-0.0.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 73ff43c04681d482a6e65b58b3afb742728c2d1d9e0effc67468e6fd3f6591c0
MD5 cc82adcd98a8abaa80f59b58ff435803
BLAKE2b-256 60caa1dfb295e86a2a684185cb6114340a5587876b62c2cc715bf07c3ed05610

See more details on using hashes here.

File details

Details for the file cbytesparse-0.0.6-cp38-cp38-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for cbytesparse-0.0.6-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 226d00c965d484a2113fd87d5233035f5cf6834b518ab9c4214ef67dca8e683a
MD5 8f3bf3819f267ecaaf9aef123bc2ea50
BLAKE2b-256 47715313b6d430fef324f84aca27e34d7e89374a2c26ed917ff4168840293fe7

See more details on using hashes here.

File details

Details for the file cbytesparse-0.0.6-cp37-cp37m-win_amd64.whl.

File metadata

File hashes

Hashes for cbytesparse-0.0.6-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 5241eb2748edac79f631f9c0f59cde34ba516f8a45be695ededac3491d3ad899
MD5 c262a3d837fd29318e149ac88efb96e0
BLAKE2b-256 f1e79eefa3bc105c4e632a23d6fcc9e569a6a6d220843d0c32f4b830574830a3

See more details on using hashes here.

File details

Details for the file cbytesparse-0.0.6-cp37-cp37m-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for cbytesparse-0.0.6-cp37-cp37m-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 e4c3cb7a7b619ffd2d7f10fa4499424a21390927b36cb3a54d8d4c451c49df62
MD5 879819a66d63bb66ebdaaa028ab5b9e9
BLAKE2b-256 361bef46f9137d1e8d77d4ae184e1c74139a82bf7e46a2cea34ccf774bbaf1f0

See more details on using hashes here.

File details

Details for the file cbytesparse-0.0.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cbytesparse-0.0.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f1c0766b82df479f8cc9055515c4312a73f51aea1bfb5f25d0074d8e9be877ee
MD5 8213933c7fe6d6c4a1801ba157428db1
BLAKE2b-256 7794446bc28d3c67ed13d367fae7776143796471036c1a8d5c7940dbeab72028

See more details on using hashes here.

File details

Details for the file cbytesparse-0.0.6-cp37-cp37m-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for cbytesparse-0.0.6-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 0d4c658b0799c6e356488d517b5792ebb986a2747b49dea4c1acf2654c7bb337
MD5 90421b32b68b97e9514455dcf9ab9411
BLAKE2b-256 401aa794fa681ca888990c5fdb3c081d9633b11b533f13abeeb82626e5845179

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page