{ "info": { "author": "Aaron Cornelius", "author_email": "a.aaron.cornelius@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3.5" ], "description": "| |Build Status|\n| |Coverage Status|\n| |Scrutinizer Code Quality|\n\nStarStruct\n==========\n\nA package that provides consistent packing and unpacking of binary data\n\nGetting Started\n===============\n\nRequirements\n------------\n\n- Python 3.5+\n\nInstallation\n------------\n\nStarStruct can be installed with pip:\n\n::\n\n $ pip install starstruct\n\nor directly from the source code:\n\n::\n\n $ git clone https://github.com/sprout42/StarStruct.git\n $ cd StarStruct\n $ python setup.py install\n\nBasic Usage\n===========\n\nAfter installation, the package can imported:\n\n::\n\n $ python\n >>> import starstruct\n >>> starstruct.__version__\n\nAn example of the package can be seen below\n\n.. code:: python\n\n import enum\n\n # Import the package\n from starstruct import Mode\n from starstruct.message import Message\n\n # A custom Enum you might be using\n class MyEnum(enum.Enum):\n my_custom_data_type = 0x0\n my_other_data_type = 0x1\n final_data_type = 0x2\n\n SizeOfData = Message('Data', [('pad', '8x')], Mode.Big)\n AnotherDataSize = Message('Data', [\n ('status', 'H'),\n ('pad', '6x'),\n ], Mode.Big)\n\n # Create your Message\n MyMessage = Message('message_name', [\n ('an_important_integer', 'i'), # Pack it into the size of a struct integer\n ('ten_long_string', '10s'), # Pack it like 10 consecutive characters\n ('a_fixed_point_number', 'F', 'i', 4), # Pack it in the size of an integer, but with four bits of precision\n # as a floating point number\n ('union_identifier', 'B', MyEnum),\n ('like_a_c_union', {\n MyEnum.my_custom_data_type: SizeOfData, # These sizes should usually all be the same,\n MyEnum.my_other_data_type: AnotherDataSize, # but they can be of different styles!\n MyEnum.final_data_type: SizeOfData,\n }, 'union_identifier'), # Choose which type of thing based on union_identifier\n ], Mode.Big) # Pack it with big endianess\n\n # Now you can use a dictionary to make your messages\n data_1 = {\n 'an_important_integer': 42,\n 'ten_long_string': 'wow! stuff',\n 'a_fixed_point_number': '1.25',\n 'union_identifier': MyEnum.my_other_data_type,\n 'like_a_c_union': {'status': 1}\n }\n\n named_tuple_version = MyMessage.make(data_1)\n print(named_tuple_version.an_important_integer) # 42\n print(named_tuple_version.a_fixed_point_number) # b'\\x00\\x00\\x00\\x14'\n\n packed_message = MyMessage.pack(data_1)\n print(packed_message) # b'\\x00\\x00\\x00*wow! stuff\\x00\\x00\\x00\\x14\\x01\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00'\n\n unpacked_message = MyMessage.unpack(packed_message)\n print(unpacked_message.an_important_integer) # 42\n print(unpacked_message.a_fixed_point_number) # 1.25\n\n # -----------------------\n # Variable sized messages\n # -----------------------\n\n RepeatedMessage = Message('Repeated', [\n ('x', 'B'),\n ('y', 'H'),\n ])\n\n VariableMessage = Message('variable_message', [\n ('length_in_objects', 'H', 'message_data'), # length field, in terms of message objects\n ('message_data', RepeatedMessage, 'length_in_objects'), # variable message length data\n (b'length_in_bytes', 'B', 'bytes_data'), # length field, in terms of packed bytes\n ('bytes_data', RepeatedMessage, b'length_in_bytes'), # variable bytes length data\n ('repeated_data', RepeatedMessage, 3), # fixed length repeated message\n ], Mode.Little)\n\n variable_data = {\n 'length_in_objects': 2, # Two objects long\n 'message_data': [\n {'x': 5, 'y': 6}, # Object number 1\n {'x': 9, 'y': 1}, # Object number 2\n ],\n 'length_in_bytes': 12, # Each object is 3 bytes long, so 4 objects\n 'bytes_data': [\n {'x': 0, 'y': 8}, # Object number 1, bytes 0 - 2\n {'x': 1, 'y': 9}, # Object number 2, bytes 3 - 5\n {'x': 2, 'y': 0}, # Object number 3, bytes 6 - 8\n {'x': 6, 'y': 2}, # Object number 4, bytes 9 - 11\n ],\n 'repeated_data': [ # No length field specified required. Just the messages\n {'x': 1, 'y': 9},\n {'x': 1, 'y': 9},\n {'x': 0, 'y': 5},\n ],\n }\n\n named_tuple_version = VariableMessage.make(variable_data)\n print(named_tuple_version.length_in_objects) # 2\n print(named_tuple_version.length_in_bytes) # 12\n print(named_tuple_version.bytes_data) # [Repeated(x=0, y=8),\n # Repeated(x=1, y=9),\n # Repeated(x=2, y=0),\n # Repeated(x=6, y=2)]\n\n packed_message = VariableMessage.pack(**variable_data)\n print(packed_message) # b' x02 x00 x05 x06 x00 t x01 x00 \\\n # x0c x00 x08 x00 x01 t x00 x02 \\\n # x00 x00 x06 x02 x00 x01 t x00 \\\n # x01 t x00 x00 x05 x00'\n\n unpacked_message = VariableMessage.unpack(packed_message)\n print(unpacked_mesage.length_in_objects) # 2\n print(unpacked_mesage.length_in_bytes) # 12\n print(unpacked_mesage.bytes_data) # [Repeated(x=0, y=8),\n # Repeated(x=1, y=9),\n # Repeated(x=2, y=0),\n # Repeated(x=6, y=2)]\n\n.. |Build Status| image:: https://travis-ci.org/sprout42/StarStruct.svg?branch=master\n :target: https://travis-ci.org/sprout42/StarStruct\n.. |Coverage Status| image:: https://coveralls.io/repos/github/sprout42/StarStruct/badge.svg?branch=master\n :target: https://coveralls.io/github/sprout42/StarStruct?branch=master\n.. |Scrutinizer Code Quality| image:: https://scrutinizer-ci.com/g/sprout42/StarStruct/badges/quality-score.png?b=master\n :target: https://scrutinizer-ci.com/g/sprout42/StarStruct/?branch=master\n\nRevision History\n================\n\n0.0.0 (YYYY/MM/DD)\n------------------\n\n- TBD\n\n\n", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/sprout42/StarStruct", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "StarStruct", "package_url": "https://pypi.org/project/StarStruct/", "platform": "", "project_url": "https://pypi.org/project/StarStruct/", "project_urls": { "Homepage": "https://github.com/sprout42/StarStruct" }, "release_url": "https://pypi.org/project/StarStruct/0.9.1/", "requires_dist": null, "requires_python": "", "summary": "StarStruct allows for easy binary stream pack/unpack", "version": "0.9.1" }, "last_serial": 2407856, "releases": { "0.9.0": [ { "comment_text": "", "digests": { "md5": "441ca6f67fdc502ac41d5a1635fe2855", "sha256": "f958d33277474a3553abfd3da28aedb1aa691cf52e3ad66d15eec97231f5bba6" }, "downloads": -1, "filename": "StarStruct-0.9.0-py3-none-any.whl", "has_sig": false, "md5_digest": "441ca6f67fdc502ac41d5a1635fe2855", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 35995, "upload_time": "2016-10-18T13:50:55", "url": "https://files.pythonhosted.org/packages/3c/2a/0521059e1ca33a523300aa395ca0a3fd738a7f16a24e5143fc1decbc507f/StarStruct-0.9.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f528e6fae1408f8fb6f9eaa1a69e0365", "sha256": "4b38c07ba00d2a5cbfa948448563d3ae262369668682b334edb268ee6f4ee74f" }, "downloads": -1, "filename": "StarStruct-0.9.0.tar.gz", "has_sig": false, "md5_digest": "f528e6fae1408f8fb6f9eaa1a69e0365", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21668, "upload_time": "2016-10-18T13:50:58", "url": "https://files.pythonhosted.org/packages/bf/2c/cd80b5a15a1067f614a1f476bcff3a459a620818582fd9759403e9ec62e4/StarStruct-0.9.0.tar.gz" } ], "0.9.1": [ { "comment_text": "", "digests": { "md5": "5fea8a6d3927d40d5bc38a9fdc2659d0", "sha256": "9b0b6cbb1e52581458b389a96135a554644d00821725e7048d78f9bb5cc58c7a" }, "downloads": -1, "filename": "StarStruct-0.9.1-py3-none-any.whl", "has_sig": false, "md5_digest": "5fea8a6d3927d40d5bc38a9fdc2659d0", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 38789, "upload_time": "2016-10-18T17:33:00", "url": "https://files.pythonhosted.org/packages/4a/fc/b754fbcaf26bcf5f0d821539b8d6632a7c98f7e330158e821541c1e39cf8/StarStruct-0.9.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bfcc58296efcffeeed41d7e2d28a2da8", "sha256": "19398c0ddb99eba3d7b3277c1d38f62e54cd252adc74ffcd2a1bb8c7f1b14782" }, "downloads": -1, "filename": "StarStruct-0.9.1.tar.gz", "has_sig": false, "md5_digest": "bfcc58296efcffeeed41d7e2d28a2da8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24342, "upload_time": "2016-10-18T17:33:04", "url": "https://files.pythonhosted.org/packages/74/6d/a8334e1fc378a14cbbc8f0748a7069d6922d415618b7104984d22cf5e343/StarStruct-0.9.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "5fea8a6d3927d40d5bc38a9fdc2659d0", "sha256": "9b0b6cbb1e52581458b389a96135a554644d00821725e7048d78f9bb5cc58c7a" }, "downloads": -1, "filename": "StarStruct-0.9.1-py3-none-any.whl", "has_sig": false, "md5_digest": "5fea8a6d3927d40d5bc38a9fdc2659d0", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 38789, "upload_time": "2016-10-18T17:33:00", "url": "https://files.pythonhosted.org/packages/4a/fc/b754fbcaf26bcf5f0d821539b8d6632a7c98f7e330158e821541c1e39cf8/StarStruct-0.9.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bfcc58296efcffeeed41d7e2d28a2da8", "sha256": "19398c0ddb99eba3d7b3277c1d38f62e54cd252adc74ffcd2a1bb8c7f1b14782" }, "downloads": -1, "filename": "StarStruct-0.9.1.tar.gz", "has_sig": false, "md5_digest": "bfcc58296efcffeeed41d7e2d28a2da8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24342, "upload_time": "2016-10-18T17:33:04", "url": "https://files.pythonhosted.org/packages/74/6d/a8334e1fc378a14cbbc8f0748a7069d6922d415618b7104984d22cf5e343/StarStruct-0.9.1.tar.gz" } ] }