char *浮动*

时间:2010-08-29 20:37:50

标签: c programming-languages types type-conversion

我想编写一个将char *缓冲区解包到float *缓冲区的函数。 char *缓冲区最初打包为浮点数到字节。

这样做的最佳方式是什么?

我在下面实现了整数。 我在char *缓冲区中打包了一个4字节大小的整数数组 这是我用来解压缩并将其分配给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 个答案:

答案 0 :(得分:2)

// 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;
    }
}

答案 1 :(得分:2)

“restrict”不是C89,只有C99。 sizeof(float)可以!= 4在几台机器上。 此解决方案独立于sizeof(float),适用于所有ANSI C环境,并以“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;
}