символ * плавать * - PullRequest
       18

символ * плавать *

1 голос
/ 30 августа 2010

Я хочу написать функцию, которая распаковывает буфер char * в буфер float *. Буфер char * изначально был упакован как число с плавающей точкой в ​​байтах.

Каков наилучший способ сделать это?

Я реализовал целые числа ниже. Я упаковал массив из 4-х байтовых целых чисел в буфер char *.
Это функция, которую я использовал, чтобы распаковать ее и присвоить ей int *.

void CharToInt(int* tar, char* src, int len) {
    char* val = src;
    char* end = src + len-1;
    for( ; val<end; tar++,val+=sizeof(int)) {
            *tar = ( (((*val) < 0) ?   256 + (*val)   : (*val)        ) +
                     (((*val+1) < 0) ? 256 + (*val+1) : (*val+1) << 8 ) +
                     (((*val+2) < 0) ? 256 + (*val+2) : (*val+2) << 16) +
                     (((*val+3) < 0) ? 256 + (*val+3) : (*val+3) << 24) );
    }
}

Добавление 256 к подписанному байту, кажется, заботится о подписанном символе. (От -128 до 127).
Это потому, что это то же самое, что переворачивать биты и вычитать 1?

В любом случае, я ищу эквивалент *.

Ответы [ 2 ]

2 голосов
/ 30 августа 2010

«Restrict» - это не C89, а только C99.sizeof (float) может! = 4 на нескольких машинах.Это решение не зависит от sizeof (float), работает во всех средах ANSI C и возвращает число успешно импортированных float в "float".

int chars_to_floats(const char *chars, float *floats, int len)
{
  int converted = 0;
  float *fp = (float*)chars;
  while( len >= sizeof*fp )
  {
    *floats++ = *fp++;
    len -= sizeof*fp;
    ++converted;
  }
  return converted;
}
2 голосов
/ 30 августа 2010
// Converts a single group of 4 chars to 1 float.
float char_to_float(const char* cs)
{
    return *(float*)cs;
}

// Converts every 4 chars into one float. len is the number of floats to unpack.
void chars_to_floats(const char* restrict chars, float* restrict floats, size_t len)
{
    for(size_t i = 0; i < len; ++i)
    {
        *floats = char_to_float(chars);
        *chars += 4;
        *floats += 1;
    }
}
...