2013-10-09 32 views
0

我想打印什麼用戶插入命令行爲HEX 當我聲明我的變量爲:unsigned char myargv [] = {0x00,0xFF}; 它工作得很好,我得到:11111111 但是當我從傳遞命令行參數我我得到不同的值 例子:MYAPP.EXE FF 我得到:01100010從命令行輸入參數爲十六進制

#include <iostream> 
#include <string> 
using namespace std; 

void writeToScreen(unsigned char *data); 

int main(int argc,unsigned char *argv[]){ 

    if(argc != 2){ 
     unsigned char myargv[] = {0x00,0xFF}; 
     writeToScreen(&myargv[1]); 
    }else{ 
     writeToScreen(argv[1]); 
    } 
    system("pause"); 
    return 0; 
} 

void writeToScreen(unsigned char *data){ 
    unsigned char dat; 
     dat =*(data); 
     for (unsigned int i=0;i<8;i++) 
     { 
      if (dat & 1) 
       cout<<"1"; 
      else 
       cout<<"0"; 
      dat>>=1; 
     } 
     cout<<endl; 
} 
+0

你調試了嗎? – StoryTeller

+0

如果使用'unsigned char myargv [] = {'F','F'};'比較輸出。你有沒有在某處看到相似之處? – molbdnilo

回答

2

你的說法是FF'F'在ASCII中是70,而70是0x46(0100 0110)。你有「0110 0010」,它是反向寫入的0x46。

首先,您需要將參數(FF)轉換爲數字。因爲目前它只是一個字符串。例如,您可以使用strtolstd::stringstream(與std::hex)。

隨着與strtol:

#include <iostream> 
#include <string> 
#include <stdlib.h> 

using namespace std; 

void writeToScreen(char *data); 

int main(int argc, char *argv[]){ 
    writeToScreen(argv[1]); 
    return 0; 
} 

void writeToScreen(char *data){ 
    unsigned char dat = strtol(data, NULL, 16); 
    for (unsigned int i=0;i<8;i++) 
    { 
     if (dat & 1) 
      cout<<"1"; 
     else 
      cout<<"0"; 
     dat>>=1; 
    } 
    cout<<endl; 
} 

當心字節仍然從LSB到MSB打印。

+0

Maxime感謝您的幫助,如果用戶輸入FFAA45會怎麼樣?是否有可能使代碼接受超過8位? – user2768374

+0

@ user2768374當然可以。但是,你不能將它存儲到一個無符號的字符。你必須改變你的循環來顯示更多的位。 –

0

另一種方法輸入的十六進制參數到程序作爲一個命令行參數是用Perl如下的幫助下,

./main $(perl -e 'print "\xc8\xce"') 

這種淨效應,將發送數據的2個字節(0xC8和0xCE)進入主程序。