[英]long/int to UINT64 conversion and back to long on C# - when can I lose data?
我有C ++服務器,它將數據發送給C#客戶端。 服務器從數據庫讀取一些值。 它具有用於序列化要通過網絡發送的數據的解析器,該解析器只能發送無符號數字,例如uint64
。
但是在數據庫中,我相信它發送給我的一個值是int/long
類型。 因此,從數據庫讀取后,可能會將其轉換為uint64
。
在C#端,我遵循該數字
balance = unchecked((long)answer.Find(ModuleGlobals.TAG_TI_BALANCE).Get_QWORD());
余額類型為long
。 但Get_QWORD C#的回報ulong
-正如我所說分析器只無符號數的作品。
那么在什么情況下我會丟失上述數據? 還是我總是會得到服務器發送給我的數據? (即使是負整數?)
我猜基本上是這樣的
int / long->通過服務器轉換/轉換為uint64->通過網絡發送->解析為ulong->強制轉換為long(如我的代碼所示)
問題發生變化時需要修訂。
更改為
balance = unchecked((int)answer.Find(ModuleGlobals.TAG_TI_BALANCE).Get_QWORD());`
C#
的long
設置為64位。 C++
的long
不一。 如果兩者大小相同(和表示形式相同),則一切正常。
但是在Windows上,C ++的long
是32位的。 因此,您將在負數上丟失符號位。 例如,從C ++前端發送-1
將在C#中為您提供0xFFFFffff
。 要使0xFFFFffff
重新回到-1
,必須將其0xFFFFffff
轉換為相同的大小類型,即int
。
但是如您所見,這仍然假設您的C ++代碼中有一定的long
大小(如果僅針對Windows,則可以)。 如果可以訪問C ++代碼,則最好將<cstdint>
long
更改為uint64_t
等固定大小的類型,然后像執行操作一樣將其轉換為C#端的long
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.