in reply to Re^3: Perl Hashes in C?
in thread Perl Hashes in C?

Ed,

This is the part I had working. Extracting uint16 is easy

>> ( $R,$G,$B ) = unpack("nnn", $myNum );
My existing code:
@ushort=unpack("S*", $buf); # Extract oodles of UINT16s
What I can't figure out is:
@UINT48 = unpack("???????", $BUF)
where each UINT48 is 48bits, 6 bytes, 1 contiguous chunk 75% as large as a (long long), 150% as long as a long, 4 byte 32 bit integer, the same size as the quanta I need.

I need 1 contiguous 6byte REDGREENBLUE

You are calling them "n"

>> n An unsigned short (16-bit) in "network" (big-endian) order. I use 'S' <c>>>S An unsigned short value.<<
I have verified that the S values agree with Photoshop color picker.

And, I broke your masterpiece tinkering with the buffer size. I was trying various sizes from 4k to 32M to find the optimal size for my large 4TB hard drives and RAID. Interesting timing results, but some wrong answers without a 4096 pixel buffer! Dang!

With a 500+ MB/sec SSD, there is no need to buffer. With spinning drives, I usually like to grab a cache-full then process while the drive does another read-ahead. I usually work on my SSD anyway.

Sysread must always return exactly the same byte count for the same file or the sky is falling. The size of the chunks has nothing to do with it. I screwed up something else. I may just leave it at 4096 * 6 and be done with it. It's already darn fast.

I think I like it as-is!

This UINT48 is going to bug me until I figure it out. I may have to hack it into Perl myself!

Thank you, Brian