#include <stdio.h>
int main(void) {
char s[]="helloo";
unsigned char last=0; // remaining bits from previous iteration in high output part
size_t j=5; // number of high input bits to keep in the low output part
unsigned char output=0;
for (char *p=s; *p; p++) { // iterate on the string
do {
output = ((*p >> (8-j)) | last) & 0x1f; // last high bits set followed by j bits shifted to lower part; only 5 bits are kept
printf ("%02x ",(unsigned)output
); j += 5; // take next block
last = (*p << (j%8)) & 0x1f; // keep the ignored bits for next iteration
} while (j<8); // loop if second block to be extracted from current byte
j -= 8;
}
if (j) // there are trailing bits to be output
printf("%02x\n",(unsigned)last
);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgppbnQgbWFpbih2b2lkKSB7CgljaGFyIHNbXT0iaGVsbG9vIjsKCQoJdW5zaWduZWQgY2hhciBsYXN0PTA7ICAgICAgICAgIC8vIHJlbWFpbmluZyBiaXRzIGZyb20gcHJldmlvdXMgaXRlcmF0aW9uIGluIGhpZ2ggb3V0cHV0IHBhcnQKCXNpemVfdCBqPTU7ICAgICAgICAgICAgICAgICAgICAvLyBudW1iZXIgb2YgaGlnaCBpbnB1dCBiaXRzIHRvIGtlZXAgaW4gdGhlIGxvdyBvdXRwdXQgcGFydCAKCXVuc2lnbmVkIGNoYXIgb3V0cHV0PTA7IAoJZm9yIChjaGFyICpwPXM7ICpwOyBwKyspIHsgICAgIC8vIGl0ZXJhdGUgb24gdGhlIHN0cmluZyAKCQlkbyB7CgkJICAgIG91dHB1dCA9ICgoKnAgPj4gKDgtaikpIHwgbGFzdCkgJiAweDFmOyAgLy8gbGFzdCBoaWdoIGJpdHMgc2V0IGZvbGxvd2VkIGJ5IGogYml0cyBzaGlmdGVkIHRvIGxvd2VyIHBhcnQ7IG9ubHkgNSBiaXRzIGFyZSBrZXB0IAoJCSAgICBwcmludGYgKCIlMDJ4ICIsKHVuc2lnbmVkKW91dHB1dCk7CgkJICAgIGogKz0gNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFrZSBuZXh0IGJsb2NrICAKIAkgICAgICAgIGxhc3QgPSAoKnAgPDwgKGolOCkpICYgMHgxZjsgICAgICAgICAgICAgLy8ga2VlcCB0aGUgaWdub3JlZCBiaXRzIGZvciBuZXh0IGl0ZXJhdGlvbiAKCQl9IHdoaWxlIChqPDgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb29wIGlmIHNlY29uZCBibG9jayB0byBiZSBleHRyYWN0ZWQgZnJvbSBjdXJyZW50IGJ5dGUKCQlqIC09IDg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCX0KCWlmIChqKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVyZSBhcmUgdHJhaWxpbmcgYml0cyB0byBiZSBvdXRwdXQKCSAgIHByaW50ZigiJTAyeFxuIiwodW5zaWduZWQpbGFzdCk7IAoJCglyZXR1cm4gMDsKfQo=