netstruct


Namenetstruct JSON
Version 1.1.2 PyPI version JSON
download
home_pagehttps://github.com/stendec/netstruct
SummaryPacked binary data for networking.
upload_time2013-09-29 07:59:47
maintainerNone
docs_urlNone
authorStendec
requires_pythonNone
licenseUNKNOWN
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            NetStruct
=========

NetStruct is a `struct <http://docs.python.org/library/struct.html>`_-like
module for Python designed to make it a bit easier to send and received packed
binary data.

NetStruct is available under the `Apache License, Version 2.0
<http://www.apache.org/licenses/LICENSE-2.0.html>`_.


Install
=======

NetStruct can be installed using `pip <http://http://pypi.python.org/pypi/pip>`_:

    pip install netstruct

You can also grab the latest code from the `git <http://git-scm.com/>`_)
repository:

    git clone git://github.com/stendec/netstruct

NetStruct runs on `Python 2.6+ <http://python.org>`_, PyPy, and Python 3
(though only Python 3.3 has been tested).


Differences from ``struct``
===========================

NetStruct has two differences from ``struct``.

First, it defaults to using network byte-order, rather than native byte-order,
on the assumption that you'll be using it to send data over the network and,
thus, it's saving you time.

Additionally, the generated strings don't have any padding when using
non-native byte-order.

Second, NetStruct supports a new formatting character, the dollar sign (``$``).
The dollar sign represents a variable-length string, encoded with its length
preceeding the string itself. To accomplish this, the formatting character
directly before the dollar sign is assumed to represent the string's length.


Examples
========

This is as basic as it gets::

    >>> import netstruct
    >>> netstruct.pack(b"b$", b"Hello World!")
    b'\x0cHello World!'

Alternatively::

    >>> netstruct.unpack(b"b$", b"\x0cHello World!")
    [b'Hello World!']

You can get a bit more complex, if you'd like::

    >>> netstruct.pack(b"ih$5b", 1298, b"largeBiomes", 0, 0, 1, 0, 8)
    b'\x00\x00\x05\x12\x00\x0blargeBiomes\x00\x00\x01\x00\x08'

And, of course, you can unpack complex data too::

    >>> netstruct.unpack(b"bh$h$i", b"'\x00\x07stendec\x00\tlocalhost\x00\x00c\xdd")
    [39, b'stendec', b'localhost', 25565]

You just have to be sure to use a long enough string::

    >>> netstruct.unpack(b"bh$h$i", b"'\x00\x07stendec\x00\tlocalhost\x00")
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "site-packages/netstruct.py", line 275, in unpack
        return NetStruct(format).unpack(data)
      File "site-packages/netstruct.py", line 165, in unpack
        raise error("unpack requires a string argument of length %d" % (len(data) + out))
    struct.error: unpack requires a string argument of length 25

But wait, you say. How am I supposed to provide a long enough string to
unpack the data when I can't possibly know the length ahead of time?
Simply put, you *can* know the length::

    >>> it = netstruct.iter_unpack(b"ih$5b")
    >>> next(it)
    11

The ``iter_unpack`` function returns an iterator. Each time you call that
iterator with ``next()``, or call its ``.send()`` method, it can return one of
two values. Either it'll return the number of bytes it wants you to read next,
or it'll return the completed object.

Let's continue from above::

    >>> it.send(b"\x00\x00\x05\x12\x00\x0b")
    16
    >>> it.send(b"largeBiomes")
    5
    >>> it.send(b"\x00\x00\x01\x00\x08   more")
    [1298, b'largeBiomes', 0, 0, 1, 0, 8]

There. I've sent enough data, so it returned the completed list of the
unpacked data. At this point, I can take my data, and do whatever it is I want
with it.

But wait! I just sent too much data to that iterator, and now I've lost some
of my string, haven't I? That's not a problem either. You can call the iterator
one final time and it will return the unconsumed remainder of the data::

    >>> next(it)
    b'   more'

It's just that simple. Of course, not everyone likes iterators, even if they
*are* quicker and less memory intensive than a class instance. NetStruct is
prepared, with its ``Unpacker`` class and ``obj_unpack``. Let's try that last
example one more time::

    >>> obj = netstruct.obj_unpack(b"ih$5b")
    >>> obj.remaining
    11
    >>> obj.feed(b"\x00\x00\x05\x12\x00\x0b")
    16
    >>> obj.feed(b"largeBiomes")
    5
    >>> obj.feed(b"\x00\x00\x01\x00\x08   more")
    0
    >>> obj.result
    [1298, b'largeBiomes', 0, 0, 1, 0, 8]
    >>> obj.unused_data
    b'   more'

Enjoy.
            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/stendec/netstruct",
    "name": "netstruct",
    "maintainer": null,
    "docs_url": null,
    "requires_python": null,
    "maintainer_email": null,
    "keywords": null,
    "author": "Stendec",
    "author_email": "me@stendec.me",
    "download_url": "https://files.pythonhosted.org/packages/b8/eb/460b09c71d65ea3ea7ff89271207935c44e30aa558b64f5102441f129191/netstruct-1.1.2.zip",
    "platform": "UNKNOWN",
    "description": "NetStruct\n=========\n\nNetStruct is a `struct <http://docs.python.org/library/struct.html>`_-like\nmodule for Python designed to make it a bit easier to send and received packed\nbinary data.\n\nNetStruct is available under the `Apache License, Version 2.0\n<http://www.apache.org/licenses/LICENSE-2.0.html>`_.\n\n\nInstall\n=======\n\nNetStruct can be installed using `pip <http://http://pypi.python.org/pypi/pip>`_:\n\n    pip install netstruct\n\nYou can also grab the latest code from the `git <http://git-scm.com/>`_)\nrepository:\n\n    git clone git://github.com/stendec/netstruct\n\nNetStruct runs on `Python 2.6+ <http://python.org>`_, PyPy, and Python 3\n(though only Python 3.3 has been tested).\n\n\nDifferences from ``struct``\n===========================\n\nNetStruct has two differences from ``struct``.\n\nFirst, it defaults to using network byte-order, rather than native byte-order,\non the assumption that you'll be using it to send data over the network and,\nthus, it's saving you time.\n\nAdditionally, the generated strings don't have any padding when using\nnon-native byte-order.\n\nSecond, NetStruct supports a new formatting character, the dollar sign (``$``).\nThe dollar sign represents a variable-length string, encoded with its length\npreceeding the string itself. To accomplish this, the formatting character\ndirectly before the dollar sign is assumed to represent the string's length.\n\n\nExamples\n========\n\nThis is as basic as it gets::\n\n    >>> import netstruct\n    >>> netstruct.pack(b\"b$\", b\"Hello World!\")\n    b'\\x0cHello World!'\n\nAlternatively::\n\n    >>> netstruct.unpack(b\"b$\", b\"\\x0cHello World!\")\n    [b'Hello World!']\n\nYou can get a bit more complex, if you'd like::\n\n    >>> netstruct.pack(b\"ih$5b\", 1298, b\"largeBiomes\", 0, 0, 1, 0, 8)\n    b'\\x00\\x00\\x05\\x12\\x00\\x0blargeBiomes\\x00\\x00\\x01\\x00\\x08'\n\nAnd, of course, you can unpack complex data too::\n\n    >>> netstruct.unpack(b\"bh$h$i\", b\"'\\x00\\x07stendec\\x00\\tlocalhost\\x00\\x00c\\xdd\")\n    [39, b'stendec', b'localhost', 25565]\n\nYou just have to be sure to use a long enough string::\n\n    >>> netstruct.unpack(b\"bh$h$i\", b\"'\\x00\\x07stendec\\x00\\tlocalhost\\x00\")\n    Traceback (most recent call last):\n      File \"<stdin>\", line 1, in <module>\n      File \"site-packages/netstruct.py\", line 275, in unpack\n        return NetStruct(format).unpack(data)\n      File \"site-packages/netstruct.py\", line 165, in unpack\n        raise error(\"unpack requires a string argument of length %d\" % (len(data) + out))\n    struct.error: unpack requires a string argument of length 25\n\nBut wait, you say. How am I supposed to provide a long enough string to\nunpack the data when I can't possibly know the length ahead of time?\nSimply put, you *can* know the length::\n\n    >>> it = netstruct.iter_unpack(b\"ih$5b\")\n    >>> next(it)\n    11\n\nThe ``iter_unpack`` function returns an iterator. Each time you call that\niterator with ``next()``, or call its ``.send()`` method, it can return one of\ntwo values. Either it'll return the number of bytes it wants you to read next,\nor it'll return the completed object.\n\nLet's continue from above::\n\n    >>> it.send(b\"\\x00\\x00\\x05\\x12\\x00\\x0b\")\n    16\n    >>> it.send(b\"largeBiomes\")\n    5\n    >>> it.send(b\"\\x00\\x00\\x01\\x00\\x08   more\")\n    [1298, b'largeBiomes', 0, 0, 1, 0, 8]\n\nThere. I've sent enough data, so it returned the completed list of the\nunpacked data. At this point, I can take my data, and do whatever it is I want\nwith it.\n\nBut wait! I just sent too much data to that iterator, and now I've lost some\nof my string, haven't I? That's not a problem either. You can call the iterator\none final time and it will return the unconsumed remainder of the data::\n\n    >>> next(it)\n    b'   more'\n\nIt's just that simple. Of course, not everyone likes iterators, even if they\n*are* quicker and less memory intensive than a class instance. NetStruct is\nprepared, with its ``Unpacker`` class and ``obj_unpack``. Let's try that last\nexample one more time::\n\n    >>> obj = netstruct.obj_unpack(b\"ih$5b\")\n    >>> obj.remaining\n    11\n    >>> obj.feed(b\"\\x00\\x00\\x05\\x12\\x00\\x0b\")\n    16\n    >>> obj.feed(b\"largeBiomes\")\n    5\n    >>> obj.feed(b\"\\x00\\x00\\x01\\x00\\x08   more\")\n    0\n    >>> obj.result\n    [1298, b'largeBiomes', 0, 0, 1, 0, 8]\n    >>> obj.unused_data\n    b'   more'\n\nEnjoy.",
    "bugtrack_url": null,
    "license": "UNKNOWN",
    "summary": "Packed binary data for networking.",
    "version": "1.1.2",
    "project_urls": {
        "Download": "UNKNOWN",
        "Homepage": "https://github.com/stendec/netstruct"
    },
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "b8eb460b09c71d65ea3ea7ff89271207935c44e30aa558b64f5102441f129191",
                "md5": "38b894eaa05cb35f6e7397277c01a8bf",
                "sha256": "70b6a5c73f5bbc7ab57b019369642adfb34dd8af41b948c400ce95f952b7df9a"
            },
            "downloads": -1,
            "filename": "netstruct-1.1.2.zip",
            "has_sig": false,
            "md5_digest": "38b894eaa05cb35f6e7397277c01a8bf",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": null,
            "size": 7215,
            "upload_time": "2013-09-29T07:59:47",
            "upload_time_iso_8601": "2013-09-29T07:59:47.910345Z",
            "url": "https://files.pythonhosted.org/packages/b8/eb/460b09c71d65ea3ea7ff89271207935c44e30aa558b64f5102441f129191/netstruct-1.1.2.zip",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2013-09-29 07:59:47",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "stendec",
    "github_project": "netstruct",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "netstruct"
}
        
Elapsed time: 0.36053s