int dts(int x) { int n = 0; while(x /= 2) n++; return n; } unsigned char * bwrite(unsigned char * encoding) { // assume host byte size is CHAR_BIT if(strlen(encoding)%CHAR_BIT != 0) { printf("warning: bit length is not evenly divisible against a byte, the last byte may be corrupted\n"); } size_t len = strlen(encoding)/CHAR_BIT; unsigned char * s = malloc(len); memset(s, 0, len); int i; for( i = 0; i < strlen(encoding); i++) { s[i>>dts(CHAR_BIT)] |= ( encoding[i] == '1' ? 1 : 0 ) >> ((CHAR_BIT-1)-(i)&(CHAR_BIT-1)); } s[len] = 0; return s; }