簡體   English   中英

reinterpret_cast-雙重給char []雙重不起作用-C ++

[英]reinterpret_cast - double to char[] to double not working - C++

我正在嘗試通過udpSendSocket在數據報中發送一些double。 數據來自QT GUI,並被發送到VS2013驅動程序(均為C ++)。 我正在使用QDataStream將數據放入QByteArray,然后將其發送出去。 一切都適用於整數,但我無法使其適用於雙精度。

我已經確認傳輸代碼可以正常工作,以便驅動程序可以接收數據報中的所有內容,因此我將在QT程序中進行所有測試。

最初,我直接向QDataStream發送了一個double值,聲稱它使用IEEE 754,然后使用* reinterpret_cast將其轉換回double值。

// QT Program
QByteArray datagram;
QDataStream out(&datagram, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_5_1);
out.setFloatingPointPrecision(QDataStream::SinglePrecision);

double test = 0.3;
out << test;
double recv = *reinterpret_cast<double*>(&datagram);

那個recv = 2.32e-317。

之后那沒用,我集中精力嘗試將double轉換為byte數組再轉換為double。 多個消息源使我相信這是可行的,但事實並非如此。

double test = 0.3;
unsigned char const* bytes = reinterpret_cast<unsigned char const*>(&test);
double recv = *reinterpret_cast<double*>(&bytes);

與那Recv = 1.33e-317。

sizeof(double)返回8。

reinterpret_cast在做什么? 我應該以其他方式進行這種轉換嗎? 有什么建議么?

謝謝

您不想reinterpret_cast &bytes ,而是bytes 前者是指針的地址,后者是值(指向的值),即double值所在的位置。

另外,將其unsigned char*unsigned char* ,而不是unsigned char* const ,這樣就不會丟棄cv限定詞

double test = 0.3;
unsigned char* bytes = reinterpret_cast<unsigned char*>(&test);
double recv = *reinterpret_cast<double*>(bytes);
std::cout << recv << std::endl;

輸出:

0.3

現場演示

@AndyG關於bytes部分是正確的。 至於datagram&datagram為您提供QByteArray對象的地址,而不是其內容的地址。 為此,您需要data()

QByteArray datagram;
QDataStream out(&datagram, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_5_1);
out.setFloatingPointPrecision(QDataStream::SinglePrecision);

double test = 0.3;
out << test;
double recv = *reinterpret_cast<double*>(datagram.data());

在您的interpret_cast示例中,您正在獲取指向bytes的指針,該指針已經是指向數據字節的指針,並轉換為指向double的指針。 如果您改為強制轉換bytes然后也強制轉換為const double* (因為reinterpret_cast不會強制轉換const double* ),它將起作用:

double recv = *reinterpret_cast<const double*>(bytes);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM