如何在C+中以小尾数从二进制文件中读取单个十六进制字符+;? 我有十六进制的数据文件,我想把它们从小字节转换成大字节,但是我遇到C++中的麻烦。C++将< 2强的六进制值作为一个值,以生成char 的字节,并总是输出十进制,相当于那些“强>2的组合的六进制值< /强>,但我不希望这样。

如何在C+中以小尾数从二进制文件中读取单个十六进制字符+;? 我有十六进制的数据文件,我想把它们从小字节转换成大字节,但是我遇到C++中的麻烦。C++将< 2强的六进制值作为一个值,以生成char 的字节,并总是输出十进制,相当于那些“强>2的组合的六进制值< /强>,但我不希望这样。,c++,C++,假设我正在读一个8字节的日期: e218 70d2 0e00 0000 代码: 所以如果你注意到e2,在基数16中,被连接为一个实体。当您转换为int时,得到:14*16+2=226。我只想读e,然后读2,依此类推。。。。 我的主要目标是翻转它,将其读取为18e2,并将其转换为十进制我该怎么做? 更新:我认为人们误解了这个问题。我只是想找到一种方法来读取包含六个值的二进制文件,并分别移动。这个问题很难在文本中描述,但无论如何,感谢那些对可能的解决方案发表评论的人。使用bits并使用以下方法解决它

假设我正在读一个8字节的日期:

e218 70d2 0e00 0000

代码:

所以如果你注意到e2,在基数16中,被连接为一个实体。当您转换为int时,得到:14*16+2=226。我只想读e,然后读2,依此类推。。。。 我的主要目标是翻转它,将其读取为18e2,并将其转换为十进制我该怎么做?


更新:我认为人们误解了这个问题。我只是想找到一种方法来读取包含六个值的二进制文件,并分别移动。这个问题很难在文本中描述,但无论如何,感谢那些对可能的解决方案发表评论的人。

使用bits并使用以下方法解决它:

预处理:

vector<bitset<64>> input;
for(int i = 0; i<SIZE; ++i){
    infile>>buffer;
    input.push_back(bitset<64>(buffer));


}
矢量输入;
对于(int i=0;i>buffer;
输入。推回(位集(缓冲区));
}
以下是函数:

unsigned long convert(vector<bitset<64>> input)
{
    bitset<64> data ;
    for(int i = input.size()-1; i>-1; --i)
        data=data|(input[i]<<i*8);
    return data.to_ullong();
}
无符号长转换(矢量输入)
{
位集数据;
对于(int i=input.size()-1;i>-1;--i)

data=data |(输入[i]“比如说,我文件中的第一个字节是e2”-对,所以你的文件不是“十六进制的”,它只是一个二进制文件。十六进制只是一种表示数字的文本方式。如果一个文件实际上是一个文本文件,比如文本为“e2 ab”,那么将其称为“包含十六进制内容”是合理的等等。但除此之外,它只是字节。所以,现在我们知道你有一个二进制文件,你期待会发生什么?目前你正在读取一个字节-这在我看来是正确的。你期待什么?二进制文件是使用读函数,如“ifstream::read()”。这“表现为未格式化的putFunction。”重载运算符>是格式化的I/O,不是二进制I/O。所以听起来好像应该读两个字节,乘以第二个值256,加上第一个值。因此,如果你读0xE2和0x18,你应该得到6370(十进制)的答案。在C++中,有可能有一种方法直接在这一步中完成,但我不是C++ + DEV:(@Sadij您的平台很可能是little endian,对吧?如果是这样,您应该寻找little endian到big endian的转换(POSIX甚至为此定义了函数)。在此之前,您可以直接阅读int64\t。但您应该使用原始流媒体,因为>>操作员接受/转换特殊字符。这些网络函数也可以修复endianess-请参阅“man-htonl”(或htons,或ntohl,或ntohs)-这些用于在主机和网络字节顺序之间转换值。也就是说,如果您的主机与网络相同,则这些值不起任何作用。但您需要确认从流中提取的数据的大小…它们是否都相同?或者是某种结构覆盖在数据上?因此,这表明每个输入都有8个字节长?这与其他内容相矛盾你提供的er信息……”我的主要目标是翻转它,将其读为18e2,并将其转换为十进制18e2只有2个字节,除非它前面有6个字节的0,你没有提到。@DOUGLASO.MOEN你是对的!为了简单起见,我只要求提供2个字节的想法。最初我的数据需要翻转8个字节。我的数据可能有关键信息,因此我避免在这里发布所有内容……我对网络非常陌生因此,我不知道很多函数,并且从头开始编写所有内容,这可能是我努力的原因。研究“持久数据”和“支持序列化数据的现有软件包”
vector<bitset<64>> input;
for(int i = 0; i<SIZE; ++i){
    infile>>buffer;
    input.push_back(bitset<64>(buffer));


}
unsigned long convert(vector<bitset<64>> input)
{
    bitset<64> data ;
    for(int i = input.size()-1; i>-1; --i)
        data=data|(input[i]<<i*8);
    return data.to_ullong();
}