从命令行输入参数为带 N 字节的十六进制



如果字节数仅等于 1,则此代码有效我想打印用户从命令行插入的内容字节数可以稍后更改

#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;
void writeToScreen(char *data);
const int NOBYTES = 2;
int main(int argc, char *argv[]){
    // Example input is: FFA6 (2 Bytes)
    writeToScreen(argv[1]);
    system("pause");
    return 0;
}
void writeToScreen(char *data){
    for(int j=0;j<NOBYTES;j++){
    unsigned char dat = strtol(data+NOBYTES-j-1, NULL, 16);
    for (unsigned int i=0;i<8;i++)
    {
        if (dat & 1) 
            cout<<"1";
        else
            cout<<"0";
        dat>>=1;
    }
    cout<<endl;
    }
}
/*
    Can i get the out put to be (FFA6):
    11111111
    10100110
*/

也许不是最好的解决方案,但应该可以解决问题

#include <string>
#include <iostream>
#include <sstream>
#include <iomanip>
#include <bitset>
...
streamstream ss(data);
string temp;
temp.resize(2);
for (;;)
{
    char temp[2];
    if (! (ss >> temp[0])) break;
    if (! (ss >> temp[1])) break;
    stringstream ss2(temp);
    unsigned int value;
    ss2 >> hex >> value;
    cout << bitset<8>(value) << endl;
}

将长度添加为参数

void writeToScreen(char *data, size_t dataLength);

在函数中使用 dataLength 而不是 NOBYTES,并调用它

writeToScreen(argv[1], strlen(argv[1]));

我不明白你在尝试什么,但是如果您想打印字符(或字符序列(的二进制值,您可以尝试以下操作:

void to_binary(const char *const p, std::size_t bytes)
{
    for (std::size_t byte = 0; byte < bytes; ++byte)
    {
        std::cout << "byte" << byte << ": " ;
        for (std::uint8_t bit = 1; bit; bit <<= 1)
        {
            std::cout << ((p[byte] & bit) ? 1 : 0);
        }
        std::cout << 'n';
    }
}

在这里,一个活生生的例子。

额外的建议writeToScreen应该将指针作为常量,它显示了仅读取传递的值的意图。

最新更新