gpt4 book ai didi

c++ - 如何连接字节数组并转换为十进制?

转载 作者:太空宇宙 更新时间:2023-11-04 03:50:00 31 4
gpt4 key购买 nike

我怎样才能连接字节?,例如

我有一个字节数组,BYTE *buffer[2] = [0x00, 0x02],但我想连接这两个字节,但要倒过来。

类似的东西

0x0200 <---

然后将这些字节转换为十进制 0x0200 = 512

但我不知道在 C 上怎么做,因为我不能使用 memcpy 或 strcat,因为缓冲区是 BYTE 而不是 CHAR,甚至不知道我是否可以这样做

谁能帮我提供代码,或者我如何连接字节以转换为十进制?

因为我有另一个字节数组,buff = {0x00, 0x00, 0x0C, 0x00, 0x00, 0x00} 并且需要做同样的事情。

请帮忙。问候。

最佳答案

BYTE不是标准类型,可能是 typedef对于 unsigned char .在这里,我将使用 <stdint.h> 中的定义为指定的字节宽度定义整数,其中一个字节是 uint8_t .

如果您考虑一下,“向后”连接两个字节很容易:

uint8_t buffer[2] = {0x00, 0x02};
uint16_t x = buffer[1] * 256 + buffer[0];

顺便说一句,它不是向后调用,而是Little Endian字节顺序。相反的是 Big Endian,其中最高有效字节在前:

uint16_t x = buffer[0] * 256 + buffer[1];

那么,就没有“转十进制”这回事了。在内部,所有数字都是二进制的。您可以将它们打印为十进制数或十六进制数或任何基数,如果您愿意,甚至可以打印为罗马数字,但它仍然是相同的数字:

printf("dec: %u\n", x);    // prints 512
printf("hex: %x\n", x); // prints 200

现在让我们看看任意长度的字节数组会发生什么:

uint8_t buffer[4] = {0x11, 0x22, 0x33, 0x44};
uint32_t x = buffer[3] * 256 * 256 * 256
+ buffer[2] * 256 * 256
+ buffer[1] * 256
+ buffer[0];

看到规律了吗?您可以将其重写为:

uint32_t x = ( ( (buffer[3]) * 256 
+ buffer[2]) * 256
+ buffer[1]) * 256
+ buffer[0];

您可以轻松地将此逻辑转换为函数:

uint64_t int_little_endian(uint8_t *arr, size_t n)
{
uint64_t res = 0ul;

while (n--) res = res * 256 + arr[n];

return res;
}

同样对于 Big Endian,当你“向前”移动时:

uint64_t int_big_endian(uint8_t *arr, size_t n)
{
uint64_t res = 0ul;

while (n--) res = res * 256 + *arr++;

return res;
}

最后,处理字节转换的代码通常不使用乘法和加法等算术运算,而是使用所谓的按位运算符。与 2 的乘法表示为将数字的所有位右移一位。 (就像十进制乘以 10 是通过将所有数字移位 1 并附加一个零来完成的。)乘以 256 将变成向左移位 8 个字节,我的 C 表示法是 x << 8。 .

加法是通过应用按位或来完成的。这两个操作并不相同,因为按位或对位进行操作并且不考虑进位。在我们的例子中,添加之间没有冲突,它们的行为相同。您的 Little-Endian 转换函数现在如下所示:

uint64_t int_little_endian(uint8_t *arr, size_t n)
{
uint64_t res = 0ul;

while (n--) res = res << 8 | arr[n];

return res;
}

如果这看起来不像一些漂亮的 C 代码,我不知道。 (如果这些按位运算符让您感到困惑,请暂时保留它们。在您的示例中,您可以使用乘法和加法。)

关于c++ - 如何连接字节数组并转换为十进制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21472312/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com