UINT8からDoubleまでデータを抽出します
-
12-12-2019 - |
質問
私は、そのサイズ(バイト数)でuint8
ポインタを受信するC機能を持っています。
このバッファからdouble
データを抽出したい。これが私のコードです:
Write(uint8* data, uint8 size) /* data and size are given by a callback to my function)*/
{
double d;
for (i = 0; i < size; i++)
{
d = ((double*)&data)[i];
printf(" d = %d\n");
}
}
.
問題は、私が外部ハードウェア内で送信しているものを受け取っていないということです。私のキャストが間違っていると思います。私は他の方法を試しましたが、良い結果もありません。私はまだ私が送るものを手に入れることができません。
解決
私があなたの質問を理解していれば(抽出するか、多くの世代のdouble
がある場合は完全にはっきりしていない)
double Write(uint8* data, uint8 size)
{
double d;
if (size < sizeof(d))
return 0; // failure; you may want something smarter than this
memcpy(&d, data, sizeof(d));
return d;
}
.
この回避は、d = *(double*)data
のようなキャストの潜在的な調整問題です。
データが有効なdouble
を表していない場合は、
は、特にそれが逆になった場合には奇妙で醜い方法で失敗することがあります(例えば、ハードウェアはリトルエンディアンで、このコードを実行しているCPUはビッグエンディアンまたはその逆の方法です)。
エイリアシングの問題が適用されている場合はまだわかりません。もう一度標準を読む必要があります。しかし、実際にそれらを見たことがない。
他のヒント
データが実際には2倍の配列であると仮定し、サイズはバイト数です。コードは、次のようになります。
Write(uint8* data, uint8 size) /* data and size are given by a callback to my function)*/
{
double d;
int i;
for (i=0; i<size/sizeof(double); ++i) {
d = ((double*)data)[i];
printf(" d = %g\n",d);
}
}
.
最もおそらく、サイズは2倍の数ではなく、2倍のサイズでサイズを分割する必要があるため、実際のダブル数を取得する必要があります。
これを行ったら:
d = ((double*)&data)[i];
.
その後、データへのポインタへのポインタはダブルポインタです。
また、PRINTF文はこのようなものでした。
printf(" d = %d\n");
.
int(%dはint)を印刷し、印刷する実際の値を与えないように指示していました。私はそれを%Gに変更しました。これは、ベストフィットフォーマットで2倍を印刷します。
Write(uint8* data, uint8 size) /* data and size are given by a callback to my function)*/
{
double d;
for (i=0; i<size; i++) {
d = ((double*)data)[i];
printf(" d = %d\n", d);
}
}
.
あなたが探しているIM推測値は、実際には2倍の配列へのポインタですので、それを正確に