On Thursday, 27 August 2015 at 09:38:52 UTC, Andrew Brown wrote:
On Thursday, 27 August 2015 at 09:26:55 UTC, rumbu wrote:
On Thursday, 27 August 2015 at 09:00:02 UTC, Andrew Brown
wrote:
Hi,
I need to read a binary file, and then process it two bits at
a time. But I'm a little stuck on the first step. So far I
have:
import std.file;
import std.stdio;
void main(){
auto f = std.file.read("binaryfile");
auto g = cast(bool[]) f;
writeln(g);
}
but all the values of g then are just true, could you tell me
what I'm doing wrong? I've also looked at the bitmanip
module, I couldn't get it to help, but is that the direction
I should be looking?
Thanks very much
Andrew
auto bytes = cast(ubyte[])read("binaryfile");
foreach(b; bytes)
{
writeln((b & 0xC0) >> 6); //bits 7, 6
writeln((b & 0x30) >> 4); //bits 5, 4
writeln((b & 0x0C) >> 2); //bits 3, 2
writeln((b & 0x03)); //bits 1, 0
}
That's lovely, thank you. One quick question, the length of the
file is not a multiple of the length of ubyte, but the cast
still seems to work. Do you know how it converts a truncated
final section?
Thanks again
Andrew
You can also avoid the bitshifts to make the code a little more
readable like this:
import std.stdio;
import std.bitmanip;
struct Crumbs
{
mixin(bitfields!(
uint, "one", 2,
uint, "two", 2,
uint, "three", 2,
uint, "four", 2
));
}
void main(string[] args)
{
ubyte[] buffer = [123, 12, 126, 244, 35];
foreach (octet; buffer)
{
auto crumbs = Crumbs(octet);
ubyte* representation = cast(ubyte*)&crumbs;
writefln("Crumb: %08b", *representation);
writefln("Crumb one: %s", crumbs.one);
writefln("Crumb two: %s", crumbs.two);
writefln("Crumb three: %s", crumbs.three);
writefln("Crumb four: %s", crumbs.four);
writeln("---------------------");
}
}
Now you can read a crumb at a time.