我在上面的語句中引用了文件。預期產出是雙倍的。我找不到與我的問題相關的任何內容。 我發現這個 Passing a structure through Sockets in C 但不知道它是否相關。 我不讀那個int64值。我從其他過程中獲得它,這就是它的設計方式。每個反序列化的64位整數應該轉換爲位等價的64位浮點數
有沒有人有關於整數的串行化和反序列化的理論?
我在上面的語句中引用了文件。預期產出是雙倍的。我找不到與我的問題相關的任何內容。 我發現這個 Passing a structure through Sockets in C 但不知道它是否相關。 我不讀那個int64值。我從其他過程中獲得它,這就是它的設計方式。每個反序列化的64位整數應該轉換爲位等價的64位浮點數
有沒有人有關於整數的串行化和反序列化的理論?
如何讀取64位數字並使用reinterpret_cast將其轉換爲按位等效的浮點數。
int64_t a = 121314;
double b = *reinterpret_cast<double*>(&a);
int64_t c = *reinterpret_cast<int64_t*>(&b);
assert(a==c);
謝謝,但它不會生成錯誤C2440:'reinterpret_cast':無法從'int64_t'轉換爲'雙' –
擊敗我:) –
恰好有一個按位拷貝的一種類型到另一個在C++定義的方式 - memcpy
。
template<class Out, class In, std::enable_if_t<(sizeof(In) == sizeof(Out))>* = nullptr>
Out mangle(const In& in)
{
Out result;
std::memcpy(std::addressof(result), std::addressof(in), sizeof(Out));
return result;
}
int main()
{
double a = 1.1;
auto b = mangle<std::uint64_t>(a);
auto c = mangle<double>(b);
std::cout << a << " " << std::hex << b << " " << c << std::endl;
}
輸出示例:
1.1 3ff199999999999a 1.1
void * comp =&(x_double);雙分量=(*(F64 *)comp);我得到了不是核心的答案。但感謝您的幫助 –
您可能會得到相同的答案,但使用c樣式轉換時的行爲不是由標準定義的 –
你爲什麼不讀出的數據直接導入'double'? – NathanOliver
std :: memcpy會爲你做。 int64和float的聯合是UB, –
感謝Nathan的更新。我沒有閱讀那篇文章。我從其他過程中獲得它,這就是它的設計方式。 –