0

我将十六进制值存储在 uint64_t 变量中。当我调用strtoull()将字符串转换为十六进制值时,我得到了正确的结果,但是当我左移 ( <<) 32 时,我丢失了前两位数。

我正在测试的字符串是"398a59b412". 我希望能回来398a59b41200000000,但我得到的不是这个8a59b41200000000

#include <openssl/aes.h>
#include <openssl/modes.h>
#include <openssl/rand.h>
#include <openssl/hmac.h>
#include <openssl/buffer.h>
#include <stdio.h>
#include <inttypes.h>
#include <stdint.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <limits.h>
#define u8 unsigned char
#define INT_BITS 32 

unsigned long long int ecountGeneration()
{
   char *test_count = "398a59b412";
   unsigned long long x = 0x398a59b412 | 0x00;
   const char *test_bearer = "15";
    const char *test_direction = "1";
    unsigned long long result;
    int64_t result_count = 0;
     
     

  //errno = 0;
   result_count = strtoull(test_count, '\0', 16);
  uint64_t  result_bearer = strtoull(test_bearer, NULL, 16);
  uint64_t  result_direction = strtoull(test_direction, NULL, 16);
  result_count = result_count  | 0x0;
  uint64_t x1 = result_count<<32;
  printf("-->%" PRIx64 "\n" ,x1);
  uint64_t x2 = result_bearer<<27;
  uint64_t x3 = result_direction<<26;
  uint64_t x4 = x1 | x2 | x3;
  
  printf("----->%" PRIu64 "\n" , x1);


  return result;
}
4

1 回答 1

1

因为 0x398a59b412 的大小是40 位

在十六进制中,每个数字可以有一个0thru范围15,这需要 4 位(又名“半字节”)。0x398a59b412有 10 位,所以它是 40 位大小。此外,<<C 中的运算符不是“循环移位”,因此最左边的两个半字节被截断(丢失)。

于 2020-10-25T21:40:05.363 回答