[英]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()
不会使用字节序列进行转换,而是使用字符串的字面含义进行转换。 即你将获得2048
与std::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.