2010-01-13 53 views
0

這裏是一些關於我的長期問題的新測試代碼。 我想,如果我長時間編碼我的東西,那麼這是移植的一半戰鬥。另一半是將其變成大端,這樣它就可以在任何64位系統上工作。 ,所以我做了以下內容:爲什麼stroull()不適用於具有十六進制值的字節數組?

#include <iostream> 
#include "byteswap.h" 
#include "stdlib.h" 

using namespace std; 

int main() 

{ 

char bytes[6] = {0x12,0x23,0xff,0xed,0x22,0x34}; 


//long *p_long = reinterpret_cast<long*> (bytes); 


long long *p_long = reinterpret_cast<long long*> (bytes); 


std::cout<<"hex="<<std::hex<<*p_long<<"LE"<<std::endl; 


*p_long = bswap_64(*p_long); 


std::cout<<"hex="<<std::hex<<*p_long<<"BE"<<std::endl; 




return 0; 

} 

這在我看來,這樣做的最簡單的方法。現在的問題是在使用BSWAP ...我得到下面的輸出

十六進制= 34563422edff2312LE 十六進制= 0BE

我得到了第一個爲LE所有字節。但現在看來64位交換功能不起作用。我認爲這將解決我遇到的問題。

考慮到我將操作一個20字節的數組。我也不知道我會如何使用指針來做到這一點。我想我需要一個長長的指針數組來存儲所有這些東西,然後調用每個字節的交換來交換每個指針的值。我個人還沒有通過sizeof(long)來增加指針的增量。

+0

我想我是試圖採取的字節數組有十六進制值在32位ENV運行到64位環境。所以,這是探索這種情況的方法之一。 所以我在想如何做到這一點。這讓我想起了。所以我正在測試它。 典型的字節輸出看起來像這樣 22f6554c4341ef55c223d3d237f10cd0ff4ba48f 將在大端形式,並且該轉換成十進制,所以我可以從最終輸出輸出x小數是什麼,我試圖做的。 – djones2010 2010-01-13 18:05:50

+0

一個字節數組沒有十六進制值。一個字節數組有字節(整數值)。你恰好在用十六進制整數文字初始化你的數組,但它與使用'{171,50,84,205,68}'初始化它沒有什麼不同。如果你試圖將一個32位整數轉換爲64位整數,那麼你可以投射(如果你不想簽名擴展,可能會掩蓋或使用無符號類型)。 – jamesdlin 2010-01-13 19:14:10

回答

0

如果您希望此程序輸出「ab3254cd44」,那麼您使用的功能錯誤。 bytes不是一個字符串。這只是一個包含5個值的數組。

試試這個:

int bytes[5] = {0xab,0x32,0x54,0xcd,0x44}; 
cout << hex; 
copy(&bytes[0], &bytes[sizeof(bytes)/sizeof(bytes[0])], ostream_iterator<int>(cout)); 

計劃的成果:

ab3254cd44

5

因爲字節0xab,0x32,0x54,0xcd,0x44不代表包含ASCII數字的空終止字符串,這是strtoll期望看到的。

你想達到什麼目的?如果你想長長的重新詮釋陣列作爲,只是做

signed long long test = *((signed long long *)bytes); 

(除非你需要添加三個字節,也使整個陣列8字節對齊)。

+0

我想我試圖採取一個字節數組,有十六進制值在32位env運行到64位env。所以,這是探索這種情況的方法之一。所以我在想如何做到這一點。這讓我想起了。所以我正在測試它。一個典型的字節輸出看起來像這樣22f6554c4341ef55c223d3d237f10cd0ff4ba48f把它放在一個大端形式,並將其轉換成十進制,所以我可以從最終輸出中輸出x小數是我正在嘗試做的。 – djones2010 2010-01-13 18:50:28

0

0xab不是有效的十六進制ASCII字符。

2

它沒有失敗 - 它已經工作。它轉換成不能轉換的第一個數字,字符代碼AB hex不是有效的十六進制數字。

0

strtoll將cstring轉換爲整數。字節不是一個cstring,它是一個5字節的數組。 由於第一個字節不是十六進制字符('1'到'0'或'a'到'f'),它返回0。

編譯器會將您給它的所有數字都視爲相同,無論它們在哪個基礎中給出,所以'字節'包含{171,50,84,205,68}。你不需要自己做轉換。

相關問題