2013-10-09 26 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)进入主程序。