7

c++でunsigned char配列をfloat配列に変換する最良の方法は何ですか?

現在、次のようなforループがあります

for (i=0 ;i< len; i++)
    float_buff[i]= (float) char_buff[i];

また、手順を逆にする必要があります。つまり、unsigned char から float に変換します (float から 8 ビットへの変換)。

for (i=0 ;i< len; i++)
    char_buff[i]= (unsigned char) float_buff[i];

アドバイスをいただければ幸いです

ありがとう

4

8 に答える 8

10

関数オブジェクトを使用するのが最善の方法だと思います。

template <typename T> // T models Any
struct static_cast_func
{
  template <typename T1> // T1 models type statically convertible to T
  T operator()(const T1& x) const { return static_cast<T>(x); }
};

に続く:

std::transform(char_buff, char_buff + len, float_buff, static_cast_func<float>());
std::transform(float_buff, float_buff + len, char_buff, static_cast_func<unsigned char>());

これは英語で行われていることを示しているため、最も読みやすいです: 静的キャストを使用してシーケンスを別の型に変換します。そして、将来のキャストは一行で行うことができます。

于 2009-05-05T16:47:50.903 に答える
8

あなたのソリューションはほとんど最良の選択肢ですが、次のように切り替えることを検討します。

char_buff[i]= static_cast<unsigned char>(float_buff[i]);
于 2009-05-05T15:18:17.827 に答える
2

最初のループはキャストを必要としません。unsigned charあるタイプ ( など) からより広いタイプ ( など) に暗黙的に変換できますfloat。2 番目のループは次を使用する必要がありますstatic_cast

for (i=0; i< len; i++)
    char_buff[i]= static_cast<unsigned char>(float_buff[i]);

static_castより狭い型への変換を行うようにコンパイラに明示的に指示するために使用します。キャストを使用しない場合、変換によってデータが失われる可能性があることをコンパイラが警告する場合があります。キャスト演算子が存在するということは、データの精度が失われる可能性があることを理解していることを意味し、それで問題ありません。これは使用するのに適切な場所ではありませんreinterpret_cast。を使用すると、実行できる変換に少なくともいくつかの制限があります (たとえば、 aを a にstatic_cast変換できない可能性があります)。 にはそのような制限はありません。Bird*Nuclear_Submarine*reinterpret_cast

また、Bjarne Stroustrupがこのテーマについて述べていることもここにあります。

于 2009-05-05T16:07:24.653 に答える
2

キャストは自動であるため、明示的にする必要はありません。
ただし、標準のアルゴリズムを使用できます。

std::copy(char_buff,char_buff+len,float_buff);

float から char に戻すと、情報が失われる可能性があります。したがって、より明確にする必要があります。

std::transform(float_buff,float_buff+len,char_buff,MyTransform());

ここでは、float を受け取って char を返す operator() を持つクラス MyTransform を使用します。それは簡単なことであるはずです。

于 2009-05-05T16:51:46.980 に答える
2

あなたの解決策は正しいように見えますが、途中でキャストで浮動数字を失う可能性があります。

于 2009-05-05T15:15:55.277 に答える
2

何の目的でこれをしているのですか?float を char に押し込むことは、実際には意味がありません。ほとんどのプラットフォームでは、float は 4 バイトで浮動小数点数を表し、char は 1 バイトで多くの場合 1 文字を表します。float を char に押し込もうとすると、3 バイトのデータが失われますよね?

于 2009-05-05T15:17:54.130 に答える
0

誰もこれについて言及していませんが、浮動小数点数を使用して計算を行っている場合は、切り捨てではなく丸めたい場合があります... char 49 があり、4.9E1 に変換された場合、いくつかの計算の後、 4.89999999E1 になり、これを char に戻すと 48 になります。

フロートで何もしていない場合、これは問題にならないはずですが、そもそもなぜフロートとして必要なのですか?

于 2009-05-05T18:29:40.833 に答える