QVariantから浮動小数点値を取得する際に問題があります。QVariantを浮動小数点に変換する
私はQVariantを返す関数を呼び出しますが、私はこのように、float値に変換する場合:
float resf = result.toFloat();
結果は常に0.0000000です。 それは私が期待した結果ではありません。
QVariant自体は空ではありません。
それは私が必要とするデータが含まれています。
私は最後の16進数値を取り、IEEE 754コンバータにそれらを養う、私は結果は私が期待してしまった:
0x411a8ad8 = 9.658897
- はなぜ結果ではありません、私は予想1? (QVariantの各要素は0x0041のように2バイトを格納できるため、変換に失敗しましたか?)
- 浮動小数点値はどのようにして取得できますか?
EDIT1:gougの提案後:
bool convert = false;
convert = result.canConvert<float>(); =>true
QVariant::Type type = result.type(); =>ByteArray
QString str_typename = result.typeName(); =>QByteArray
しかし、結果はまだ同じです:
QByteArray ba = result.toByteArray();
float fl = ba.toFloat(); =>fl = 0.00000000000
EDIT2:aatwoの提案後:
bool bValid = true;
result.toFloat(&bValid); =>bValid = false
bValid = true;
ba.toFloat(&bValid); =>bValid = false
したがって、両方の変換が失敗しました。「canConvert」でも「true」が返されます。
QByteArray floatByteArray = result.toByteArray();
float floatValue = *(float*)(floatByteArray.data());
はまた、私は期待値を返しません:
しよう
をしかし、私はそれが働いて得る:
quint32 temp = ((char)ba[0] << 24) + ((char)ba[1] << 16) + ((char)ba[2] << 8) + (char)ba[3];
float* out = reinterpret_cast<float*>(&temp); =>out = 9.658897
感謝を!
QVariant :: type()とQVariant :: canConvert()の結果を調べてみてください。生データの検査にもかかわらず、私の推測では、QVariantは浮動小数点に変換できるものがあることを知らないということです。 – goug
QVariant :: toFloat(bool *)オーバーロードを使用すると、boolは成功または失敗を示しますか?恐らく、おそらく失敗しているように思えます。これはおそらく、バリアントに浮動小数点型が含まれていないためです。そのコードの2番目のスニペットでは、基になるデータ型が実際にQByteArrayであるように見えます。この場合、浮動小数点の格納方法を知る必要があります。たとえば、基本的に浮動小数点数の文字列表現ですか?または生のフロートデータ? – aatwo
バリアントを返す関数へのコードを表示します。壊れている。それが問題の原因です。あなたが表示するコードではありません。 –