繁体   English   中英

将BYTE数组转换为unsigned long long int

[英]Convert BYTE array into unsigned long long int

我正在尝试将BYTE数组转换为等效的无符号long long int值,但我的编码没有按预期工作。 请帮助修复它或建议替代方法。

附加信息:这4个字节组合为十六进制数,等效十进制数是输出。 假设给定byteArray = {0x00,0xa8,0x4f,0x00},十六进制数是00a84f00,它的等效十进制数是11030272。

#include <iostream>
#include <string>

typedef unsigned char BYTE;

int main(int argc, char *argv[])
{
  BYTE byteArray[4] = { 0x00, 0x08, 0x00, 0x00 };
  std::string str(reinterpret_cast<char*>(&byteArray[0]), 4);
  std::cout << str << std::endl;

  unsigned long long ull = std::strtoull(str.c_str(), NULL, 0);
  printf ("The decimal equivalents are: %llu", ull);


  return EXIT_SUCCESS;
}

我得到以下输出:

The decimal equivalents are: 0

虽然预期产量是:

The decimal equivalents are: 2048

当你调用std::strtoull(str.c_str(), NULL, 0); ,它提供的第一个参数相当于一个空字符串 ,因为string本质上是一个以null结尾的字符序列。

其次, std::strtoull()不会使用字节序列进行转换,而是使用字符串的字面含义进行转换。 即你将获得2048std::strtoull("2048", NULL, 10)

另一点需要注意的是, unsigned long long是64位数据类型,而您的字节数组只提供32位。 您需要用零填充其他32个字节以获得正确的结果。 我使用直接赋值,但你也可以在这里使用std::memset()

你想要做的是:

ull = 0ULL;
std::memcpy(&ull, byteArray, 4);

鉴于您的平台有little-endian ,结果应该是2048

你首先必须记住的是一个字符串,实际上是一个以空字符结尾的字符串。 其次,字符串是一串字符 ,而不是你拥有的字符串。 第三个问题是你有一个四个字节的数组,它对应一个无符号的32位整数,你想要一个(至少)64位的类型,它是8个字节。

您可以使用临时变量,对std::memcpy的简单调用以及赋值来解决所有这些问题:

uint32_t temp;
std::memcpy(&temp, byteArray, 4);
ull = temp;

当然,这假设字节顺序是正确的。


请注意,我使用std::memcpy而不是std::copy (或std::copy_n ),因为明确提到std::memcpy能够以这种方式绕过严格别名,而我不认为std::copy功能是。 std::copy函数更多的是复制元素而不是匿名字节(即使它们也可以这样做,但使用笨拙的语法)。

鉴于答案是使用std::memcpy ,我想指出有一种更惯用的方法来执行此操作:

char byteArray[] = { 0x00, 0x08, 0x00, 0x00 };
uint32_t cp;
std::copy(byteArray, byteArray + sizeof(cp), reinterpret_cast<char*>(&cp));

std::copy类似于std::memcpy ,但它是C ++的做法。

请注意,您需要将输出变量cp的地址cp为以下值之一: char *unsigned char *signed char *std::byte * ,否则操作将不是面向字节的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM