Во-первых, давайте предположим, что я отсортировал endian и знаю размер типов априори.
Вот что я делаю: у меня есть функция bs2i(char *bitStr)
, которая принимает массив символов, представляющий двоичный файл со знаком char / short / int / long. Массив может быть любой длины <= <code>sizeof(long long).
Что я хочу сделать, так это взять bitStr [0] и установить его в качестве знакового бита, чтобы он не усекался, если я сделаю что-то вроде char val = bs2i("111")
. В этом случае функция должна возвращать -125, поскольку биты будут установлены как «000 ... 00010000011». Для этого мне нужно знать, какой длины должен быть последний тип, чтобы я мог сдвинуть msb в нужное место.
Это то, что я имею до сих пор:
size_t size = (((strlen(bitStr)-1)>>3)+1)<<3;
Но я только что понял, что работает только для символов и шорт. Например, строка длиной 17 должна возвращать размер 32, но возвращать только 24 с этим методом. Есть ли эффективный способ определить правильную длину?
Для справки, вот полная функция:
long long bs2i(char *bitStr) {
long long val = 0l;
size_t len = (((strlen(bitStr) - 1) >> 3) + 1) << 3;
char msb = *bitStr & 1;
bitStr++;
while (*bitStr) {
val = (val << 1l) | (*bitStr & 1);
bitStr++;
}
val = (msb << len-1l) | val; /* Use MSB as sign bit */
return val;
}
Бонусные баллы, я думаю, если есть хороший способ сделать это, не требующий априорного знания размеров шрифта.