Я хотел бы напечатать то, что пользователь вставляет из командной строки как 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;
}
Вы являетесь аргументом FF
. 'F'
- 70 в ASCII, а 70 - 0x46 (0100 0110). У вас есть "0110 0010", который равен 0x46, записанным в обратном порядке.
Итак, сначала вам нужно преобразовать аргумент (FF) в число. Потому что в настоящее время это только строка. Вы можете использовать strtol
или std::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.
Другой способ ввода шестнадцатеричных параметров в программу в качестве параметра командной строки - с помощью Perl, как показано ниже,
./main $(perl -e 'print "\xc8\xce"')
Это в сетевом эффекте отправит 2 байт (0xC8 и 0xCE) данных в основную программу.