连接两个十六进制数字

Concatenating two hexadecimal numbers

本文关键字:两个 十六进制数字 连接      更新时间:2023-10-16

如果我有一个十六进制数(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)

我该怎么做?谢谢

首先:如果您的文件是"原始"二进制文件,则不应该使用fscanf来读取它。请使用fread

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

第二:我不知道你的目标,但我认为,你应该像这样"打包"读取的字节:

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

或者,您可以一次将16位读取到unsigned short变量中,然后在需要时交换其字节:

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 )))

由于这只是原始二进制数据,因此您不需要使用格式化的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;
}

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

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