Входные параметры как HEX из командной строки

0

Я хотел бы напечатать то, что пользователь вставляет из командной строки как HEX, когда я объявляю свою переменную как: unsigned char myargv [] = {0x00,0xFF}; он отлично работает, я получаю: 11111111, но когда я передаю свои параметры из командной строки, я получаю другое значение. Пример: myApp.exe FF я get: 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;
}
Теги:

2 ответа

2

Вы являетесь аргументом FF. 'F' - 70 в ASCII, а 70 - 0x46 (0100 0110). У вас есть "0110 0010", который равен 0x46, записанным в обратном порядке.

Итак, сначала вам нужно преобразовать аргумент (FF) в число. Потому что в настоящее время это только строка. Вы можете использовать strtol или std::stringstreamstd::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
    Максим спасибо тебе за помощь, а что если пользователь введет FFAA45 ?? Можно ли сделать так, чтобы код принимал больше 8 бит ??
  • 0
    @ user2768374 Да, конечно. Но тогда вы не можете сохранить его в неподписанном символе. И вы должны изменить свой цикл, чтобы отобразить больше битов.
0

Другой способ ввода шестнадцатеричных параметров в программу в качестве параметра командной строки - с помощью Perl, как показано ниже,

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

Это в сетевом эффекте отправит 2 байт (0xC8 и 0xCE) данных в основную программу.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню