【问题标题】:How to concatenate two byte arrays in C?如何在C中连接两个字节数组?
【发布时间】:2015-04-23 11:41:37
【问题描述】:

我正在 Arduino 平台上进行编码,我正在尝试编写一些可以在 C 中连接/附加字节数组的东西。

byte a[] = {a1, ..., an};
byte b[] = {b1, ..., bm};

byte c[] = a + b; // equivalent to {a1, ..., an, b1, ..., bm}

获得上述结果的最佳方法是什么?

我尝试在线搜索,但运气不佳。我在 SO 上看到了另一个答案,强调了执行此操作所需的步骤,但是我无法遵循它们。他们还说有些库可以处理这种事情,但是由于我在 Arduino 上,我不确定这些库是否对我完全可用。

我知道需要进行某种内存操作才能使其正常工作,但是我对这些低级操作不熟悉,所以它们对我来说没有太大意义。我有高级语言(C#、Java 和一些 C++)方面的经验。


我还应该补充一点:相同的技术是否适用于:

byte a[] = {a1, ..., an};
byte b[] = {b1, ..., bm};

a = a + b

【问题讨论】:

  • 尺寸是固定的吗?
  • 假设 bytechar 大小的等价物,byte c[sizeof(a) + sizeof(b]; 和两个 memcpy 调用会做到这一点,如果这确实是声明 ab 的方式。
  • @WhozCraig 是的。 a 和 b 是这样声明的。但是,我已经编辑了问题以包含 b 也被 附加 到 a 的情况。
  • @Alizter 不会发生,除非 a 最初的大小可以容纳其数据和附加数据的空间,并且迟早仍会涉及 memcpy 类型的操作。无论如何,您使用的语法肯定与 C 语言不一致。
  • @WhozCraig 是的。我知道它绝对不是 C。我用伪风格写了它以更好地解释我的麻烦。

标签: c arrays arduino concatenation


【解决方案1】:

C 中没有byte 类型。除非是某种类型定义,否则您可以使用unsigned char<stdint.h> 中的一些固定类型。无论如何,这里有一些解决方案:

#include <stdio.h>
#include <string.h>

int main(void) {
    unsigned char a[3+3] = {1, 2, 3}; // n+m
    unsigned char b[3]   = {4, 5, 6}; // m

    memcpy(a+3, b, 3); // a+n is destination, b is source and third argument is m

    for (int i = 0; i < 6; i++) {
        printf("%d\n", a[i]);
    }

    return 0;
}

确保数组a 至少有空间容纳n + m 元素(此处为n = 3m = 3)以避免数组溢出问题(即未定义的行为,这可能会使您的程序崩溃或更糟)。

【讨论】:

  • 如何确保 a 有足够的空间?
  • @Alizter unsigned char a[3 + 3] 显然可以容纳最初的a + 附加的b
  • @iharob 哦!我虽然缺少一些尺寸。当然。
  • 因此,如果我们要讨论数组c,假设ab 已满,我们需要将c 设为a + b 的“长度”,然后使用memcpy() 复制到c b 然后a。我不确定的是您使用的 a+3 语法。这是什么意思?
  • @Alizter:哦,我的认知只注册了a=a+b案例。按照c=a+b 的顺序,您需要将a 复制到c,然后将b 复制到c+nc+n 的工作方式与 a+3 相同。 a“衰减”(或更正式地被转换)为数组中第一个元素的地址。通过带有整数的+ 运算符,您正在执行指针运算。 a+3 等同于 &amp;a[3],所以我相信您现在知道了。
【解决方案2】:

如果大小已知,您可以简单地创建一个该大小的新字节数组并使用简单的循环来填充它。

【讨论】:

  • 不,不需要涉及循环。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-14
  • 1970-01-01
  • 1970-01-01
  • 2016-04-27
  • 2021-02-11
  • 1970-01-01
  • 2019-06-07
相关资源
最近更新 更多