C++ 以二进制模式扫描文件,并将十六进制字符解释为C+中的实际数字+;

C++ 以二进制模式扫描文件,并将十六进制字符解释为C+中的实际数字+;,c++,binary,hex,character,decimal,C++,Binary,Hex,Character,Decimal,我知道这个标题听起来可能令人困惑。我有一个简单的问题,我还没能解决 让我们假设我有一个文件,用十六进制编辑器打开它显示它里面有两个字符,比如0x1B和0x00(显然无法打印)。我想把它作为1B00在HEX中,也就是6912在DEC中,而不是直接转换字符,这将是错误的,这也是我看到的所有其他问题所问的。嗯,这就是我想在这里做的任务。看起来很简单,但我所尝试的一切都是错的!尽管我显然是以二进制模式打开文件 我只设法逐个地读取字符,并将其弄乱一点,但从来没有做我真正想要做的事情,这很简单,只需将这2个

我知道这个标题听起来可能令人困惑。我有一个简单的问题,我还没能解决

让我们假设我有一个文件,用十六进制编辑器打开它显示它里面有两个字符,比如0x1B0x00(显然无法打印)。我想把它作为1B00HEX中,也就是6912DEC中,而不是直接转换字符,这将是错误的,这也是我看到的所有其他问题所问的。嗯,这就是我想在这里做的任务。看起来很简单,但我所尝试的一切都是错的!尽管我显然是以二进制模式打开文件

我只设法逐个地读取字符,并将其弄乱一点,但从来没有做我真正想要做的事情,这很简单,只需将这2个十六进制字符解释为十六进制数,然后将其转换为十进制

对不起,有什么不清楚的地方,我不是以英语为母语的人。任何帮助都将不胜感激,我相信你会认为这是一个非常愚蠢的问题:P

编辑:对不起,显然我没有解释清楚。我知道这可能看起来很抽象,但这确实是一件具体的小事,我一直在努力解决,但我一直无法解决。也许我可以用另一种方式问:


如何以二进制模式扫描字符,比如说0x1B,并将其转换为实际的1B字符。就这样。

如果您只想以十六进制形式打印一个数字,请使用

inti=0x1B;
std::cout
std::ifstream-infle(“test.bin”,std::ofstream::binary);
while(true)
{
char c1=ifs.get();
如果(!infle.good())
{
打破
}
char c2=ifs.get();
如果(!infle.good())
{
打破
}

int num=(int)c1 |((int)c2听起来像是要将文件作为原始数据读取,然后以十进制显示在屏幕上?非常简单

int main() {
    std::ifstream myfile("filename.data", std::ofstream::binary);
    uint16_t number;
    char* buffer = (char*)(&number);
    while(myfile.read(buffer, sizeof(number))) {
        std::cout << number << ' ';
    }
}
intmain(){
std::ifstream myfile(“filename.data”,std::ofstream::binary);
uint16_t编号;
字符*缓冲区=(字符*)(&number);
而(myfile.read(buffer,sizeof(number))){

std::难道你必须至少表现出一些努力,因为几乎不可能回答你可能做错的所有可能的事情,而这不是一个“猜测我在试图做什么,并给出可能正确或可能不正确的建议”的网站吗…这是一个二进制文件,我的意思是,它是一个.txt文件,但打开它只会显示2个奇怪的ASCII字符,所以它们的十六进制值才是真正重要的。很抱歉,这条评论是对上一条评论的回应。我确实尝试了很多方法来解决这个问题,我只是感到困惑,我不能做这么简单的事情。我将更新我的主要帖子来解释好一点。你想“把它们解释成十六进制,然后转换成十进制”?每当我看到这些单词,我马上认为你不知道自己在说什么。(你的问题澄清了,是的,你不知道自己在说什么)。该文件没有十六进制,您不想将其转换为十进制。谢谢您的帮助。抱歉,但我认为它确实解释了我想要的内容,至少用蹩脚的英语哈哈。听着,每当我以二进制模式扫描我的文件时,字符都是ASCII格式的。如果我遇到0x20字符,它会扫描一个空格,非常符合逻辑。我想做的是获取实际的十六进制值,即20,并将其转换为十进制,即32。仅此而已。所以扫描0x1B并输出27。尽管如此,因为我已经得到了一个实际有用的答案。哦,非常感谢,这正是我想要的,真不敢相信它这么简单,谢谢:D我知道它会很简单,但哇,接受了!我想由于OP描述了以十六进制打开文件,并看到
0x1B
0x00
,(其中
0x00
无法打印),因此您将OP设置为“白费力气”您在所有错误的位置检查流的状态,这可能导致读取超过文件结尾,而您忽略了文件结尾,然后尝试解释,这是一种未定义的行为。@MooingDuck在每次读取之前检查EOF。此代码绝对不可能读取超过文件结尾的内容。不幸的是,这是一个非常复杂的问题常见且不正确的观点。遗憾的是,在每次读取之前检查EOF并不能阻止读取文件结尾以外的内容。:(@MooingDuck收回这一点,总是混淆std::getline和这一个之间的顺序。希望在这一个之后我会记得:)提示:大多数iostream函数(包括getline)设计为在
if
条件下或
while
循环中工作。
get
并不不幸,所以你必须哦,我明白了,非常感谢,伙计,很抱歉以前表达得这么差,让这一切比实际情况更难理解。我现在测试了它,它完全符合我的要求;)
std::ifstream infile("test.bin", std::ofstream::binary);

while (true) 
{
    char c1 = ifs.get();
    if (!infile.good())
    {
        break;
    }

    char c2 = ifs.get();
    if (!infile.good())
    {
        break;
    }

    int num = (int)c1 |((int)c2 << 8);

    // if you need the oppisite order then
    // int num = (int)c2 &((int)c1 << 8);
    cout << num;
}
int main() {
    std::ifstream myfile("filename.data", std::ofstream::binary);
    uint16_t number;
    char* buffer = (char*)(&number);
    while(myfile.read(buffer, sizeof(number))) {
        std::cout << number << ' ';
    }
}