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

时间:2014-01-31 04:18:12

标签: c++ c arrays buffer concatenation

如何连接字节?,例如

我有一个字节数组,BYTE * buffer [2] = [0x00,0x02],但是我希望连接这两个字节,但是后退。

类似的东西

0x0200< ---

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

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

有人可以帮我一个代码,或者如何连接字节以转换为十进制?

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

请帮忙。 问候。

1 个答案:

答案 0 :(得分:1)

BYTE不是标准类型,可能是typedef的{​​{1}}。在这里,我将使用unsigned char中的定义来定义指定字节宽度的intgers,以及字节为<stdint.h>的位置。

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

uint8_t

顺便说一句,它不是向后调用,而是Little Endian字节顺序。相反的是Big Endian,其中最重要的字节首先出现:

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

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

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];

同样对于Big Endian,你是否“前进”:

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

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

    return res;
}

最后,处理字节转换的代码通常不使用乘法和加法的算术运算,而是使用所谓的逐位运算符。乘以2表示为将数字的所有位右移1。 (通过将所有数字乘以1并附加零来完成乘以10的十进制。)乘以256将成为左移8字节的位移,其中i C符号为uint64_t int_big_endian(uint8_t *arr, size_t n) { uint64_t res = 0ul; while (n--) res = res * 256 + *arr++; return res; }

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

x << 8

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