如何在c中的char数组中复制uint8_t数组

时间:2016-05-30 14:59:26

标签: c arrays uint8t

我会在char数组中复制一个uint8_t数组。 我尝试了不同的解决方案:cast,memcopy,strcpy ...... 但它不起作用!我的小例子是:

num: 123456789
A: 7 5b cd 15
B: 7 5b ffffffcd 15
x: 123457023

印刷品是:

{{1}}

为什么我在x中得到一个不同的数字?

2 个答案:

答案 0 :(得分:0)

您必须稍微修改一下代码,以确保处理某些未定义的行为,例如signed int值溢出。

#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
#include <arpa/inet.h>

int main()
{
    uint32_t num = 123456789;
    printf("\n num: %" PRIu32 "\n", num);
    uint32_t x;
    uint8_t a[4];
    unsigned char b[4];

    num=htonl(num);

    a[0] = num & 0x000000FFu;
    a[1] = (num & 0x0000FF00u) >> 8;
    a[2] = (num & 0x00FF0000u) >>16;
    a[3] = (num & 0xFF000000u) >>24;

    b[0] = a[0];
    b[1] = a[1];
    b[2] = a[2];
    b[3] = a[3];


    printf("\nA: %x %x %x %x", a[0],a[1],a[2],a[3]);
    printf("\nB: %x %x %x %x", b[0], b[1], b[2], b[3]);


    x = b[0] | (b[1] & 0x000000FFu)<<8 | (b[2] & 0x000000FFu)<<16 | (b[3] & 0x000000FFu)<<24;

    x = ntohl(x);

    printf("\n x vale: %" PRIu32 "\n", x);

    return 0;
}

如你所见:

  1. b数组声明为unsigned char以避免undefined behavior。它还会更正代码中第3个printf打印的值。
  2. 将值插入a数组中,如果在将它们移动到正确位置之前屏蔽要移动的位,则更清楚。
  3. 当您计算x值时,您正在对8 bit变量执行左移。所以你在8班后失去了所有的位。并使用32 bit HEX literal来确定它们,您可以确保使用正确的移位大小和or s
  4. 关于第3点,正如@ 2501所指出的那样,你必须使用u作为文字,以确保在int的大小小于32位或者signed int具有陷阱值的平台上避免使用UB。见6.4.4.1。 p5标准。

答案 1 :(得分:0)

我不明白为什么对memcpy的调用不起作用。只需检查CHAR_BIT == 8以确保char被定义为8位类型(某些实现将char定义为16位大)然后调用memcpy(b, a, sizeof(b) / sizeof(b[0]))。这应该是诀窍。 不要忘记为string.h添加memcpy,为limits.h添加CHAR_BIT

正如其他人指出的那样,你仍然可能会遇到麻烦,因为char的签名也是实现定义的。因此,您应将b声明为unsigned char以防止未定义的行为。

要100%保存,您还应检查ab是否具有相同的大小,这样您就不会遇到任何运行时错误。

相关问题