连接两个十六进制数

时间:2014-11-10 09:31:37

标签: c++ algorithm

如果我有一些十六进制数字(20)我正在从文件中读取,那么就这样说吧,

0a 0b bc 05 50 

我正在使用

将它们读成两个字符
fscanf(p,"%c",&a);
fscanf(p,"%c",&b);

其中p是文件指针,a和b是无符号字符。 现在,我想连接它们并形成一个数字。像这样,我想连接两个十六进制数中的每一个,最后计算10对的总和,因为总共有20个数。我怎么能用C ++做到?

我尝试过使用它,

unsigned int result = (a<<24) | (b<<16)

我该怎么办?谢谢!

3 个答案:

答案 0 :(得分:3)

首先:如果您的文件是&#34; raw&#34;二进制,那么你不应该使用fscanf来阅读它。请改用fread

fread( &a, sizeof( a ), 1, p );
fread( &b, sizeof( b ), 1, p );

第二次:我不知道你的目标,但我想,你应该&#34;打包&#34;像这样的readed字节:

unsigned int result = ( unsigned int(a) << 8 ) | b;

或者你可以在一个unsigned short变量中读取16位,然后在需要时交换它的字节:

unsigned short a;
fread( &a, sizeof( a ), 1, p );
unsigned int result = ( (a & 0xF) << 8 ) | ( a >> 8 ); // if you need swap
unsigned int result = a; // it you don't )))

答案 1 :(得分:2)

由于这只是原始二进制数据,因此您不需要使用格式化I / O或读取单个字符 - 您只需将字节对读取为16位整数并将它们相加,例如

uint32_t sum = 0;
for (int i = 0; i < 10; ++i)
{
    uint16_t v;

    fread(&v, sizeof(v), 1, p):
    //NB: swap high/low bytes of `v` here if endianness is incorrect
    sum += v;
}

答案 2 :(得分:0)

如果您的文件是包含十六进制数字的文本文件(如您在示例中所示),则可以使用"%x"作为格式字符串来读取整个十六进制数字。

int n;
while(!feof(p)){
   fscanf(p,"%x",&n);
   //no conversion needed...
}