0

当我将变量声明为: unsigned char myargv[] = {0x00,0xFF}; 时,我想将用户从命令行插入的内容打印为 HEX 它工作正常,我得到: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;
}
4

2 回答 2

2

你的论点是FF'F'在 ASCII 中是 70,而 70 是 0x46 (0100 0110)。你有“0110 0010”,它是反向写的 0x46。

因此,首先,您需要将参数 (FF) 转换为数字。因为目前,它只是一个字符串。例如,您可以使用strtolor std::stringstream(with 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。

于 2013-10-09T12:08:25.097 回答
0

将十六进制参数作为命令行参数输入程序的另一种方法是在 Perl 的帮助下,如下所示,

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

这实际上是向主程序发送 2 个字节(0xC8 和 0xCE)的数据。

于 2016-10-04T20:51:57.457 回答