float型データとint型,バイト配列の変換について

3964 ワード

JAvaにおけるfloatとintの変換はint i=Floatである.floatToIntBits(v);反対の関数と、かなり便利です.
以下で紹介するのはC++中
c++float intビット別相互回転inline float int 32_bitcast_float32(int temp){return(*((float *)((void *)(&temp))));}
inline int   float32_bitcast_int32(float temp){return(*((int *)((void *)(&temp))));}
バイトとfloat intの相互変換
シリアル通信はバイト単位で伝送され,浮動小数点数と整数数に対してはバイト配列を変換して通信する必要がある.
MCUとPCの浮動小数点数はIEEE 754形式に基づいている.4バイト(float)、8バイト(double)、10バイト(サポートされていないものもあります).ここでは4バイト(float)浮動小数点数を例に挙げる.
変換の一般的な方法は次のとおりです.
一、強制ポインタタイプ変換.
//Intデータをバイト配列に変換
unsigned int intVariable,i;
unsigned char charArray[2];
(unsigned char) * pdata = ((unsigned char)*)&intVariable;//ポインタの強制変換を行う
for(i=0;i<2;i++)
{
    charArray[i] = *pdata++;     
}     
//floatデータをバイト配列に変換
unsigned int i;
float floatVariable;
unsigned char charArray[4];
(unsigned char) * pdata = ((unsigned char)*)&floatVariable;//ポインタの強制変換を行う
for(i=0;i<4;i++)
{
    charArray[i] = *pdata++;     
}
//バイト配列からintデータへの変換
unsigned int   intVariable="0";
unsigned char  i; 
void   *pf;     
pf   =&intVariable; 
(unsigned char) * px = charArray;  
for(i=0;i<2;i++)
{
 *(((unsigned char)*)pf+i)=*(px+i);     
}  
//バイト配列からfloatデータへの変換
float   floatVariable="0";
unsigned char  i; 
void   *pf;     
pf   =&floatVariable; 
(unsigned char) * px = charArray;  
for(i=0;i<4;i++)
{
 *(((unsigned char)*)pf+i)=*(px+i);     
}   
二、使用構造と連合
構造と結合を定義するには、次のようにします.
typedef union {struct {unsigned char low_byte;
           unsigned char mlow_byte;
           unsigned char mhigh_byte;
           unsigned char high_byte;
          }float_byte;
       struct {unsigned int low_word;
          unsigned int high_word;
          }float_word;
       float  value;
      }FLOAT;
typedef union   {
        struct {
        unsigned char low_byte;
        unsigned char high_byte;
        } d1;
    unsigned int value;
    } INT;
使用方法:
浮動小数点数の場合:
FLOAT floatVariable;プログラムにfloatVariableを直接使用する.float_byte.high_byte,floatVariable.float_byte.mhigh_byte,
floatVariable.float_byte.mlow_byte,floatVariable.float_byte.low_byteの4バイトで簡単に変換できます.
例:
main()
{
 unsigned char c[]={0x80,0xDA,0xCC,0x41};//4バイトの順序が逆になる
 FLOAT x;
 x.float_byte.high_byte=0x41;
 x.float_byte.mhigh_byte=0xCC;
 x.float_byte.mlow_byte=0xDA;
 x.float_byte.low_byte=0x80;
 
 printf("%f/n",x.value);//25.607
}
整数:
INT intVariable;プログラムにintVariableを直接使用する.value.high_byte,intVariable.value.low_byteでOKです.
三、整数数を数学演算の方法で変換することができる
unsigned int intVariable;
unsigned char low_byte = intVariable%256;
unsigned char high_byte = intVariable/256;
=================================================
バイトをfloatに復元するには、もう1つの方法があります.
           int,      int     (     int   32-bit   ):

#include <stdio.h>
#include <math.h>

/* C         Java      byte     ?   。        */
typedef unsigned char byte;

int fourBytesToInt( byte b1, byte b2, byte b3, byte b4 ) {
    return ( b1 << 24 ) + ( b2 << 16 ) + ( b3 << 8 ) + b4;
}

float intBitsToFloat( int bits ) {
    /* s    (sign);e    (exponent);m      (mantissa)*/
    int
    s = ( bits >> 31 ) == 0 ? 1 : -1,
    e = ( bits >> 23 ) & 0xff,
    m = ( e == 0 ) ?
                     ( bits & 0x7fffff ) << 1 :
                     ( bits & 0x7fffff ) | 0x800000;
    return s * m * ( float ) pow( 2, e - 150 );
}

void main( ) {
    printf( "%f", intBitsToFloat( fourBytesToInt( 64, 78, 249, 219 ) ) );
}
IEEE 754規格におけるfloat型記憶方式に関する別の記事:
http://chuansu.iteye.com/blog/1484917