I'm not sure I understand the syntax here:
'char' defRD (3 :0)
(POS=:POS+1) ] FILEBUF{~POS
:
(POS=:POS+x) ] FILEBUF{~POS+i.x
)
What is 'char' here? Also the (3:0) seems out of place. What the brackets?
One of the things I am actually trying to do is to write a MessagePack (
http://msgpack.org/ ) implementation in J.
MessagePack is a serialization format, that is (in theory) more compact than
JSON.
There are implementations in pretty much every popular language.
The specification is here
https://github.com/msgpack/msgpack/blob/master/spec.md
For example, my first draft for floats can be "packed" by
float64 =: 'cb' NB. constant byte for floats (64-bit floats)
convertFloat =: |."1@:,@:(|."1)@:hfd@:(a.&i.)@:(2&(3!:5)) NB. convert float to
hex string
packFloat =: float64&, @: convertFloat NB. append the float byte
The specification is not terribly complicated, and on GitHub you can read
implementations that are only 500~ish lines long in most languages.
> Date: Sat, 24 Jan 2015 01:45:06 +0900
> From: [email protected]
> To: [email protected]
> Subject: Re: [Jprogramming] J Equivalent of Python Struct.Pack/Unpack
>
> Thanks,
> I am going to try to read through that code tomorrow. It looks interesting.
>
> --- Original Message ---
>
> From: "Raul Miller" <[email protected]>
> Sent: January 24, 2015 1:00 AM
> To: "Programming forum" <[email protected]>
> Subject: Re: [Jprogramming] J Equivalent of Python Struct.Pack/Unpack
>
> Here is some example code I have used to extract from streamed object files:
>
> FILEBUF=: '' NB. is read or mapped from file
> POS=: 0 NB. marks next unread byte
>
> defRD=: 2 :0
> ('read_',m)=: v
> )
>
> NB. readers - left argument of dyad is vector length to read
>
> 'char' defRD (3 :0)
> (POS=:POS+1) ] FILEBUF{~POS
> :
> (POS=:POS+x) ] FILEBUF{~POS+i.x
> )
> 'byte' defRD (a.i.read_char)
>
> ic=: 3!:4
> 'Flags' defRD (3 :0)
> (POS=:POS+2) ] {. 0 ic FILEBUF {~ POS+i.2
> :
> (POS=:POS+2*x) ] 0 ic FILEBUF {~ POS+i.2*x
> )
>
>
> fc=: 3!:5
> 'float' defRD (3 :0)
> (POS=:POS+4) ] {. _1 fc FILEBUF {~ POS+i.4
> :
> (POS=:POS+4*x) ] _1 fc FILEBUF {~ POS+i.4*x
> )
>
> 'IndexString' defRD [: NB. don't ask
>
> 'int' defRD (3 :0)
> (POS=:POS+4) ] {. _2 ic FILEBUF {~ POS+i.4
> :
> (POS=:POS+4*x) ] _2 ic FILEBUF {~ POS+i.4*x
> )
>
> NB. bools have a dual existence:
> NB. a true/false value (a count - 0 or 1 times)
> NB. a literal value (an arbitrary number)
> 'bool' defRD ((,"0~*)@read_int)
>
> 'Ptr' defRD read_int
>
> 'Ref' defRD read_int
>
> 'short' defRD (3 :0)
> (POS=:POS+2) ] {. _1 ic FILEBUF {~ POS+i.2
> :
> (POS=:POS+2*x) ] _1 ic FILEBUF {~ POS+i.2*x
> )
>
> 'ushort' defRD (3 :0)
> (POS=:POS+2) ] {. 0 ic FILEBUF {~ POS+i.2
> :
> (POS=:POS+2*x) ] 0 ic FILEBUF {~ POS+i.2*x
> )
>
> 'unsigned' defRD ((2^32) | read_int)
> 'uint' defRD read_unsigned
>
> NB. special compound (or other) defs
> 'SizedString' defRD (3 :0)
> length=. read_int ''
> value=. length read_char ''
> :
> NB. boxing needed to preserve length of strings
> x <@read_SizedString Repeated ''
> )
> 'string' defRD read_SizedString
>
> ...
>
> As you can see, this is rather bulky (for J). The full code is even
> bulkier (and never went anywhere, though maybe I'll get back to it at
> some point).
>
> This winds up being a line of code for every item that you want to
> read. But once you have defined a word that reads a structure from
> file you can just use it and not worry too much about its
> implementation (as long as the implementation is correct).
>
> The code to write things back out winds up being about the same amount of
> bulk.
>
> I'm not sure if this is useful to you, but I'm not using it right now,
> so if you get some use from it that means my time writing it was not
> entirely wasted.
>
> Thanks,
>
> --
> Raul
>
>
> On Tue, Jan 20, 2015 at 10:42 AM, Jon Hough <[email protected]> wrote:
> > Python has a useful module called struct
> > https://docs.python.org/2/library/struct.html
> > which is useful for converting strings to packed binary data.
> > e.g.
> > data = struct.pack('B', someHexString)
> >
> > Does J have an equivalent or similar function / verb?
> > I spent a bit of time looking, but couldn't find anything.
> >
> > Example usage would be sending data over a network.
> >
> >
> >
> > ----------------------------------------------------------------------
> > For information about J forums see http://www.jsoftware.com/forums.htm
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm