2010-08-29 39 views
1

我想寫一個函數,將char *緩衝區解包到float *緩衝區。 char *緩衝區最初被打包爲浮點數到字節。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相同?

無論如何,我正在尋找float *等價物。

+2

你只是想讀一串小端'int'的流嗎? – kennytm 2010-08-29 20:45:59

+0

你誤解了浮動工作方式,他們在你的例子中不會像整數一樣工作(字符實際上只是小整數)。上面的例子是有效的,因爲整數可以表示爲2的冪的和,而浮點數不能。要序列化和反序列化浮動我會尋找一些浮動 - >字符串 - >浮動浮動函數。 – Robin 2010-08-29 20:47:10

+0

這是什麼目的?你需要可移植性嗎?請解釋你期望的浮動*等值。 – 2010-08-29 20:48:33

回答

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; 
} 
+3

這隻適用於如果'chars'正確對齊作爲'float'訪問。你可以通過使用'memcpy(float ++,fp ++,sizeof * fp);'來代替賦值。 – caf 2010-08-30 00:40:48

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; 
    } 
} 
+0

不錯!謝謝。我是C新手,我沒有意識到我可以投到不同的指針類型,C會知道該怎麼做。 – 2010-08-29 21:21:20

+0

沒問題,兄弟。 :) – 2010-08-29 21:43:27