2011-11-16 21 views
0

我有一個long long保存ASCII十六進制值,並希望將其轉換爲字符串。我有這個代碼:如何將長長的ASCII十六進制值轉換爲字符串?

char myBuffer[8]; 
long long myLongLong = 0x7177657274797569; 
sprintf(myBuffer,"%c%c%c%c%c%c%c%c",myLongLong); 
int x; 
cout << myBuffer; 
cin >> x; 
return 0; 

十六進制代碼應該是"qwertyui",但它總是給出其他值。

我試圖與%c%s%X但它不給我我的輸出需要,最接近的是%c但它打印出來只有一個字符。

回答

3

該代碼是錯誤在很多方面,我不知道從哪裏開始...

  • myBuffer是太小,無法容納8 chars + NUL終止符,即。應該是myBuffer[9]
  • sprintf期待8個參數,你只傳遞1個參數。其他必需的參數將是堆棧中的任何參數。
  • myLongLong不是char
  • 你不考慮字節順序。
  • 您正在使用C函數並以C++方式在C++中執行操作。爲什麼不使用std::string s而不是C風格字符串和stringstream s作爲sprintf的替代方案?

你想要什麼最接近幾乎工作示例,類似於你的例子,是這樣的:

#include <cstdio> 
#include <iostream> 

using namespace std; 

int main(void) 
{ 
    char myBuffer[9]; 
    long long myLongLong = 0x7177657274797569; 
    char *c_ptr = (char*)&myLongLong; 
    sprintf(myBuffer,"%c%c%c%c%c%c%c%c", c_ptr[0], c_ptr[1], c_ptr[2], c_ptr[3], c_ptr[4], c_ptr[5], c_ptr[6], c_ptr[7]); 
    int x; 
    cout<<myBuffer; 
    cin>>x; 
    return 0; 
} 

哪樣我little-endian的機器上輸出"iuytrewq"。正如我所提到的那樣,這沒有考慮到排列順序。如果機器是小端的,那麼你可以反過來讀/打印字節。

我真的不明白你爲什麼試圖這樣做,但...

+0

謝謝,你的代碼工作,但逆轉:),如何扭轉它? 我想解密一個DES加密,我試圖優化我的代碼到最大。 – SKandeel

+1

@SherifMaherEaid:在這個例子中,只是顛倒了'sprintf'的參數:'...,c_ptr [7],c_ptr [6],c_ptr [5],...,c_ptr [0]'。 – AusCBloke

0

你想打印long-long的每個字節ascii char?

然後,您需要循環冗長的一次提取一個字節,查看位移和掩碼。

提示它通常更容易(如果你知道的長度),以從最後一個字節的工作和右移

或 - 你可以只memcpy的長隆進字符數組 - 除了任何字節順序的問題

0

你可以嘗試

union { char buf[8]; long long num; } u; 
u.num = 0x7177657274797569LL; 
cout << u.str << endl; 

但我不明白你真的要做些什麼。 endianness怎麼樣?

+0

小端。 我想解密一個DES加密。 – SKandeel

+0

您的代碼有效。但它是u.buf而不是u.str,u.buf在顯示時也有一些額外的垃圾字符,但在調試時,我可以看到它包含所有字符,問題只是在顯示。 – SKandeel

1

使用字符串流

long long myLongLong = 0x7177657274797569; 
std::stringstream ss; 
ss << std::hex << myLongLong; 
std::cout << ss << std::endl 
0

請嘗試下面的代碼。

#include <iostream> 

using namespace std; 

int main(void) 
{ 

char myBuffer[8]; 
long long myLongLong = 0x7177657274797569; 

for(int i = 0; i<8;i++) 
{ 
    myBuffer[i] = myLongLong>>(64-(i+1)*8); 
} 

cout<<myBuffer<<endl; 

return 0; 

} 
相關問題