#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const char *string2bin_ar[] = {
"0000", // 0
"0001", // 1
"0010", // 2
"0011", // 3
"0100", // 4
"0101", // 5
"0110", // 6
"0111", // 7
"1000", // 8
"1001", // 9
"1010", // A
"1011", // B
"1100", // C
"1101", // D
"1110", // E
"1111", // F
};
char *
string2binstr(char *hexstring) {
size_t len
= strlen(hexstring
); size_t idx = 0;
unsigned char no;
char *out;
if (!len) {
fprintf(stderr
, "string2bin: no input data"); return NULL;
}
/* string can't be less then 32 bits (chars in sample)
* 32 (minimum length) / 4 (hex chunk length) = 8 (number of hex chuncks) */
out
= calloc(1, (len
< 8 ? 32 : len
* 4 ) + 1); if (!out) {
fprintf(stderr
, "string2bin: no enough memory\n"); return NULL;
}
out[len * 4] = '\0';
for (; idx < len; idx++) {
no = (unsigned char)hexstring[idx];
if (no >= '0' && no <= '9')
no -= '0';
else if (no >= 'A' && no <= 'F')
no -= ('A' - 10);
else if (no >= 'a' && no <= 'f')
no -= ('a' - 10);
else no = 0;
memcpy(&out
[idx
* 4], string2bin_ar
[no
], 4); }
/* fill missing bits (bytes) */
if (idx < 8)
memset(&out
[idx
* 4], '0', 32 - idx
* 4); return out;
}
int main(int argc, char *argv[])
{
printf("%s\n", string2binstr
("FF"));
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKY29uc3QgY2hhciAqc3RyaW5nMmJpbl9hcltdID0gewogICAgICAgICIwMDAwIiwgLy8gMAogICAgICAgICIwMDAxIiwgLy8gMQogICAgICAgICIwMDEwIiwgLy8gMgogICAgICAgICIwMDExIiwgLy8gMwogICAgICAgICIwMTAwIiwgLy8gNAogICAgICAgICIwMTAxIiwgLy8gNQogICAgICAgICIwMTEwIiwgLy8gNgogICAgICAgICIwMTExIiwgLy8gNwogICAgICAgICIxMDAwIiwgLy8gOAogICAgICAgICIxMDAxIiwgLy8gOQogICAgICAgICIxMDEwIiwgLy8gQQogICAgICAgICIxMDExIiwgLy8gQgogICAgICAgICIxMTAwIiwgLy8gQwogICAgICAgICIxMTAxIiwgLy8gRAogICAgICAgICIxMTEwIiwgLy8gRQogICAgICAgICIxMTExIiwgLy8gRgogICAgICAgIH07CgoKY2hhciAqCnN0cmluZzJiaW5zdHIoY2hhciAqaGV4c3RyaW5nKSB7CiAgICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihoZXhzdHJpbmcpOwogICAgICAgIHNpemVfdCBpZHggPSAwOwogICAgICAgIHVuc2lnbmVkIGNoYXIgbm87CiAgICAgICAgY2hhciAqb3V0OwogICAgICAgIGlmICghbGVuKSB7CiAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInN0cmluZzJiaW46IG5vIGlucHV0IGRhdGEiKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KICAgICAgICAvKiBzdHJpbmcgY2FuJ3QgYmUgbGVzcyB0aGVuIDMyIGJpdHMgKGNoYXJzIGluIHNhbXBsZSkKICAgICAgICAgKiAzMiAobWluaW11bSBsZW5ndGgpIC8gNCAoaGV4IGNodW5rIGxlbmd0aCkgPSA4IChudW1iZXIgb2YgaGV4IGNodW5ja3MpICovCiAgICAgICAgb3V0ID0gY2FsbG9jKDEsIChsZW4gPCA4ID8gMzIgOiBsZW4gKiA0ICkgKyAxKTsKICAgICAgICBpZiAoIW91dCkgewogICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzdHJpbmcyYmluOiBubyBlbm91Z2ggbWVtb3J5XG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KICAgICAgICBvdXRbbGVuICogNF0gPSAnXDAnOwogICAgICAgIGZvciAoOyBpZHggPCBsZW47IGlkeCsrKSB7CiAgICAgICAgICAgICAgICBubyA9ICh1bnNpZ25lZCBjaGFyKWhleHN0cmluZ1tpZHhdOwogICAgICAgICAgICAgICAgaWYgKG5vID49ICcwJyAmJiBubyA8PSAnOScpCiAgICAgICAgICAgICAgICAgICAgICAgIG5vIC09ICcwJzsKICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5vID49ICdBJyAmJiBubyA8PSAnRicpCiAgICAgICAgICAgICAgICAgICAgICAgIG5vIC09ICgnQScgLSAxMCk7CiAgICAgICAgICAgICAgICBlbHNlIGlmIChubyA+PSAnYScgJiYgbm8gPD0gJ2YnKQogICAgICAgICAgICAgICAgICAgICAgICBubyAtPSAoJ2EnIC0gMTApOwogICAgICAgICAgICAgICAgZWxzZSBubyA9IDA7CiAgICAgICAgICAgICAgICBtZW1jcHkoJm91dFtpZHggKiA0XSwgc3RyaW5nMmJpbl9hcltub10sIDQpOwogICAgICAgIH0KICAgICAgICAvKiBmaWxsIG1pc3NpbmcgYml0cyAoYnl0ZXMpICovCiAgICAgICAgaWYgKGlkeCA8IDgpCiAgICAgICAgICAgICAgICBtZW1zZXQoJm91dFtpZHggKiA0XSwgJzAnLCAzMiAtIGlkeCAqIDQpOwogICAgICAgIHJldHVybiBvdXQ7Cn0KCmludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCnsKCXByaW50ZigiJXNcbiIsIHN0cmluZzJiaW5zdHIoIkZGIikpOwoJCglyZXR1cm4gMDsKfQ==