2012-07-27 33 views
6

我需要執行的操作需要我從一個字符陣列得到一個int32_t值和2的int64_t值獲取一個int32_t或從一個字符陣列的int64_t值

前4個字節的字符數組的包含INT32值,接下來的8個字節包含第一個int64_t值,接下來的8個字節包含第二個字節。我無法弄清楚如何獲得這些價值。我努力了;

int32_t firstValue = (int32_t)charArray[0]; 
int64_t firstValue = (int64_t)charArray[1]; 
int64_t firstValue = (int64_t)charArray[3]; 

int32_t *firstArray = reinterpet_cast<int32_t*>(charArray); 
int32_t num = firstArray[0]; 
int64_t *secondArray = reinterpet_cast<int64_t*>(charArray); 
int64_t secondNum = secondArray[0]; 

我只是抓着吸管。任何幫助表示讚賞

+0

'int32_t * firstArray = reinterpet_cast (charArray);'應該實際工作。不是嗎? – Mysticial 2012-07-27 04:34:42

+0

是的,我實際上可以得到數組,但我如何獲得第二個和第三個值?他們是64位。 – Miek 2012-07-27 04:36:32

回答

4

快速和骯髒的解決方案:

int32_t value1 = *(int32_t*)(charArray + 0); 
int64_t value2 = *(int64_t*)(charArray + 4); 
int64_t value3 = *(int64_t*)(charArray + 12); 

注意,這有可能導致未對齊的內存訪問。所以它可能並不總是有效。


不違反嚴格走樣,不會有對齊問題更強大的解決方案:

int32_t value1; 
int64_t value2; 
int64_t value3; 

memcpy(&value1,charArray + 0,sizeof(int32_t)); 
memcpy(&value2,charArray + 4,sizeof(int64_t)); 
memcpy(&value3,charArray + 12,sizeof(int64_t)); 
+0

[Edsger Dijkstra算法不批准你的第一個解決方案。(http://www.catonmat.net/blog/wp-content/uploads/2008/11/edsger-dijkstra-quick-and-dirty.jpg) – 2012-07-27 04:41:47

+0

謝謝你非常喜歡,最好的方法應該適合我的需要,並且我現在看到它再次看到它。 – Miek 2012-07-27 04:46:23

+1

@Miek要知道,第一個解決方案不是由標準保證的 - 即使它可能會在所有現代的編譯器與'的sizeof(int32_t)工作== 4'和'的sizeof(的int64_t)== 8' – Mysticial 2012-07-27 04:48:08

0

如果charArray是1個字節char類型,那麼你需要使用412您的第二和第三值

1

試試這個

typedef struct { 
    int32_t firstValue; 
    int64_t secondValue; 
    int64_t thirdValue; 
} hd; 

hd* p = reinterpret_cast<hd*>(charArray); 

現在您可以訪問例如P-> firstValue

編輯:確保結構包裝上字節邊界例如使用Visual Studio你結構

+0

由於'struct'填充和對齊,這將不起作用。 – Mysticial 2012-07-27 04:38:35

+0

,然後將限定包設置爲字節,例如的#pragma包(1) – 2012-07-27 04:41:04

+0

填充可以阻止這樣做...你可以使用'的#pragma pack'指令,但是,是不是太輕便。 – dreamlax 2012-07-27 04:42:13

1

之前寫#pragma pack(1)爲了避免任何對準的擔憂,理想的解決方案是將字節從緩衝區拷貝到目標對象。要做到這一點,你可以使用一些有用的工具:

typedef unsigned char const* byte_iterator; 

template <typename T> 
byte_iterator begin_bytes(T& x) 
{ 
    return reinterpret_cast<byte_iterator>(&x); 
} 

template <typename T> 
byte_iterator end_bytes(T& x) 
{ 
    return reinterpret_cast<byte_iterator>(&x + 1); 
} 

template <typename T> 
T safe_reinterpret_as(byte_iterator const it) 
{ 
    T o; 
    std::copy(it, it + sizeof(T), ::begin_bytes(o)); 
    return o; 
} 

那麼你的問題很簡單:

int32_t firstValue = safe_reinterpret_as<int32_t>(charArray); 
int64_t secondValue = safe_reinterpret_as<int64_t>(charArray + 4); 
int64_t thirdValue = safe_reinterpret_as<int64_t>(charArray + 12);