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
My existing code:>> ( $R,$G,$B ) = unpack("nnn", $myNum );
What I can't figure out is:@ushort=unpack("S*", $buf); # Extract oodles of UINT16s
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.@UINT48 = unpack("???????", $BUF)
I need 1 contiguous 6byte REDGREENBLUE
You are calling them "n"
I have verified that the S values agree with Photoshop color picker.>> n An unsigned short (16-bit) in "network" (big-endian) order. I use 'S' <c>>>S An unsigned short value.<<
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
|
|---|