2014-09-26 105 views
1

我轉換長爲8時隙字節數組C#8字節數組回長(C#至C++)

Byte[] Data = BitConverter.GetBytes(data.LongLength);

例如,如果data.LongLenght是172085時,得到下面的數組{ 53,160,2,0,0,0,0,0} 但是之後,我發送到我的c + +服務器,我想再次得到它。

我tryed這一點,但沒有成功......

long fileLenght = 0; 
for(int i=0;i < 8; ++i) 
    fileLenght = (fileLenght << 8) + Data[i]; 
+1

它被存儲爲小端,你必須向後迭代。請注意,C++ * long *與C#long不同,您需要很長的時間。這種棘手的細節使得它不是通過電線發送二進制數據是一個好主意。 – 2014-09-26 19:16:23

+0

@HansPassant說什麼。您應該定義一個逐字節的協議,以便對等方始終可以重新組合數據,無論是否需要語言/版本/接收它的任何內容(也檢測消息邊界 - 您的8字節消息可能無法到達一個recv呼叫)。 – 2014-09-26 19:22:25

回答

1

documentation

由GetBytes方法返回的數組中的字節順序取決於計算機體系結構是否是小 - 端點或大端。

它看起來像在你的硬件陣列首先與其最低有效字節發送。因此,你應該從數組的末尾開始你的循環:

int64_t fileLenth = 0; 
for(int i=7;i >= 0; --i) 
    fileLenght = (fileLenght << 8) + Data[i]; 

Demo.(打印172085)

爲了實現用C#更好的兼容性,應使用system-independent 64-bit integral type代替long,即int64_t

1

只要發送跨網絡的數據,你必須頭腦endianness

在你的情況下,它看起來像的正確方法從字節數組重建長將是從右到左重建它:

long fileLength = 0; 
for(int i=7; i >= 0; i--) 
    fileLength = (fileLength << 8) + Data[i]; 

但這並不總是如此。根據端點的硬件和操作系統以及使用的網絡傳輸協議,您可能會以大端或小端格式顯示數據,接收端可能是小端或大端。

+0

'每當你通過網絡發送數據時,你都必須考慮排序' - 不是真的,不是。你必須介意一個合適的協議,以確保你的數據可以被正確解釋。 – 2014-09-26 19:23:49

+0

@MartinJames - 我認爲我們正在談論同樣的事情 - 通過選擇一個協議來幫助您處理您牢記的(或至少承認它)的字節順序。無論哪種方式,重要的是要知道並非所有的系統和媒體都以相同的方式表示多個八位字節的值,並相應地設置您的期望(我的2c) – 2014-09-26 21:12:51

0

如果兩端具有相同的字節順序(C#始終是小端,可能是你的C++也):

long long fileLength; 
memcpy(&fileLength, Data, 8); 

優化編譯器將幾乎肯定把它轉換成一個單一的64位的舉動,所以不要擔心它看起來像一個昂貴的函數調用。