request for get-bytes (to join get-int, get-string, etc)

Q&A's, tips, howto's
Locked
TedWalther
Posts: 608
Joined: Mon Feb 05, 2007 1:04 am
Location: Abbotsford, BC
Contact:

request for get-bytes (to join get-int, get-string, etc)

Post by TedWalther »

I am writing a Postgres module modeled on the MySQL module.

Postgres sometimes sends binary data as a result of queries.

newlisp strings can contain binary data, right?

Although I could probably work out something with (append), would it make sense to have a (get-bytes <i>addr</i> <i>nbytes</i>) function in the base distribution?

My brain is too fried right now to implement it.

Also, it might be more efficient to use the underlying memcpy() function of C in a builtin (get-bytes ...) rather than me implementing it. Although as my mind works, I do see I could do it in a line or two of code. Once I take a break.

Lutz
Posts: 5289
Joined: Thu Sep 26, 2002 4:45 pm
Location: Pasadena, California
Contact:

Post by Lutz »

This is how you can do it:

Code: Select all

(set 'buffer (dup "\000" nbytes))

(cpymem addr buffer nbytes)
the variable buffer has now the original binary content in the original byte order and with the correct size information.

And here is a slightly more complicated and slower method:

Code: Select all

(set 'buffer (first (unpack (format "s%d" nbytes) addr)))

TedWalther
Posts: 608
Joined: Mon Feb 05, 2007 1:04 am
Location: Abbotsford, BC
Contact:

Post by TedWalther »

Lutz wrote:This is how you can do it:

Code: Select all

(set 'buffer (dup "\000" nbytes))

(cpymem addr buffer nbytes)
the variable buffer has now the original binary content in the original byte order and with the correct size information.

And here is a slightly more complicated and slower method:

Code: Select all

(set 'buffer (first (unpack (format "s%d" nbytes) addr)))


Thanks Lutz. Somehow I missed the cpymem function.

Ted

Locked