使用字节和字符串文字初始化C数组

时间:2015-03-03 11:10:21

标签: c initialization string-literals

我想一次初始化一个包含一些字节值和字符串文字的字节数组。本质上,数组是数据结构的序列化表示,如

struct foo {
  uint8 param1;
  uint8 stringLen;
  const char * string;
  uint8 param2;
};

尽管API需要字节数组,但我无法控制它。 API期望为sizeof运算符静态初始化数组以报告实际大小。我知道可以使用字符串文字或特定字节初始化一个数组,尽管任何尝试初始化数组都将字符串文字中的两个最终都视为指针地址(这是什么,这并不奇怪)。

我正在考虑定义自己的struct并使用它初始化数组,但我不相信结构甚至字符串文字是编译时可序列化的。我似乎无法想到这样的语法,甚至不确定这是否可行。任何意见都赞赏。

最后一种方法可能是用array[] = "\x66oo"之类的东西来初始化数组,但这只比简单的array[] = {0x66, 'o', 'o'}稍微更易于维护,两种解决方案都需要外部(python?)生成器。

2 个答案:

答案 0 :(得分:2)

您必须使用如下函数初始化字节数组:

uint8 *initByteArray(const struct foo *foo)
{
    unsigned slen = foo->string ? strlen(foo->string) : 0;
    assert(slen <= 255);
    uint8 *array = malloc(slen + 3);
    unsigned i = 0;
    array[i++] = foo->param1;
    array[i++] = (uint8)slen;
    if (slen) {
        strncpy(&array[i], foo->string, slen);
        i += slen;
    }
    array[i++] = foo->param2;
    return array;
}

如果struct包含长度大于1的任何整数(即uint16等),那么您还需要在编码期间考虑它们的字节顺序。

答案 1 :(得分:0)

C允许分解字符串文字(也在初始化程序中);编译器会为你粘贴它们。

所以,你可以这样做:

char unit1[8] = "\x40" "\x05" "Hello" "\x3e";
char unit2[9] = "\x40" "\x06" "World!" "\x3e";

char unitBoth[] = "\x40" "\x05" "Hello" "\x3e"
                  "\x40" "\x06" "World!" "\x3e";

unitBoth[]数组没有定义的大小;它只比一个字节长一个字节(nul字节)。


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

int main(void)
{
unsigned idx, len;

printf("Unit1 Size = %zu\n", sizeof unit1);
for (idx=0; idx < sizeof unit1; idx++) {
        printf("%u : %02x\n" , idx , 0xff & unit1[idx] );
        }

printf("\nUnit2 Size = %zu\n", sizeof unit2);
for (idx=0; idx < sizeof unit2; idx++) {
        printf("%u : %02x\n" , idx , 0xff & unit2[idx] );
        }

printf("\nUnitBoth Size = %zu\n", sizeof unitBoth);
for (idx=0; idx < sizeof unitBoth; idx++) {
        printf("%u : %02x\n" , idx , 0xff & unitBoth[idx] );
        }

return 0;
}

当然,您可以创建程序或脚本来生成定义。 (并将它们包含在您的主程序中,可能在全球范围内)