2011-12-30 46 views
6

的「GetBytes會」的實施,我發現,在.NET Framework中GetBytes功能的實現是一樣的東西:關於在BitConverter

public unsafe static byte[] GetBytes(int value) 
{ 
    byte[] bytes = new byte[4]; 
    fixed(byte* b = bytes) 
    *((int*)b) = value; 
    return bytes; 
} 

我不敢肯定我瞭解這些的全部細節兩行:

fixed(byte* b = bytes) 
    *((int*)b) = value; 

有人可以在這裏提供更詳細的解釋嗎?我該如何在標準C++中實現這個功能?

回答

4

可能有人在這裏提供了更詳細的解釋?

MSDN documentation for fixed帶有衆多實例和解釋 - 如果這還不夠,那麼你就需要明確哪些特定的部分,你不明白。


我應該如何實現在標準C這個功能++?

#include <cstring> 
#include <vector> 

std::vector<unsigned char> GetBytes(int value) 
{ 
    std::vector<unsigned char> bytes(sizeof(int)); 
    std::memcpy(&bytes[0], &value, sizeof(int)); 
    return bytes; 
} 
0

固定告訴垃圾收集器不要移動託管類型,以便可以使用標準指針訪問該類型。在C++中,如果你不使用C++/CLI(即不使用.NET),那麼你可以使用一個字節大小的指針(char)並循環遍歷所有要轉換的字節。

要知道字節序...

0

首先固定必須使用,因爲我們想要一個指針賦值給一個變量管理:

固定語句阻止垃圾回收器重新定位 移動變量。固定聲明只允許在不安全的 上下文中使用。固定也可以用來創建固定大小的緩衝區。

固定語句設置一個指向管理變量的指針,並在語句執行期間「變形」 該變量。如果沒有修正, 指向可移動管理變量的指針幾乎沒有用處,因爲 垃圾回收可能無法預測地重定位變量。 C#編譯器只允許您在 固定語句中指定一個管理變量的指針。Ref

然後我們聲明一個指向字節的指針並分配給字節數組的開始。

然後,我們投的指針字節的指針爲int,取消對它的引用並將其分配給傳入的int值。

0

該函數創建一個包含相同的二進制數據的平臺的表示形式的字節數組整數value。在C++中,這可以實現(對於任何類型的真的)像這樣:

int value; // or any type! 
unsigned char b[sizeof(int)]; 
unsigned char const * const p = reinterpret_cast<unsigned char const *>(&value); 
std::copy(p, p + sizeof(int), b); 

b現在是儘可能多的字節數組作爲類型int(或任何類型您使用)的大小。

在C#中,您需要說fixed以獲取原始指針,因爲通常您在C#中沒有原始指針,因爲在內存中沒有固定位置的對象 - 垃圾回收器可以隨時移動它們。 fixed可以防止這種情況發生並修復對象,因此原始指針可能有意義。

0

您可以使用簡單的函數模板爲任何POD類型實現GetBytes()。

#include <vector> 

template <typename T> 
std::vector<unsigned char> GetBytes(T value) 
{ 
    return std::vector<unsigned char>(reinterpret_cast<unsigned char*>(&value), 
             reinterpret_cast<unsigned char*>(&value) + sizeof(value)); 
}