如何创建静态const数组的数组

时间:2016-01-28 15:16:13

标签: c arrays

在我的.c文件中,我jpg[4]检查某个文件中的jpg签名(使用memcmp()):

static const unsigned __int8 jpg[4] = { 0xFF, 0xD8, 0xFF, 0xDB };

比较效果很好,现在我想添加更多格式签名,例如:

static const unsigned __int8 png[8] = { 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A };

我不想复制具有不同签名变量的粘贴代码。如何创建此类不更改值的数组,并使用for(;;)遍历每个签名。我不想在方法中声明它们。

我知道它是一些基本的东西,但我对C来说很陌生,所以对我来说不是那么明显。

在伪代码中:

bool isImg(bool * value)
{
for(int index = 0; index < signatures count; i+++) <-- for should iterate through signatures
    {
        // use signature[index] which is array of bytes { 0xFF, Ox... }
        // check signature
    }
}

1 个答案:

答案 0 :(得分:1)

也许你想要这样的东西:

static const unsigned __int8 jpg[4] = { 0xFF, 0xD8, 0xFF, 0xDB };
static const unsigned __int8 png[8] = { 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A };

static const unsigned __int8 *signatures[] = { jpg, png };

现在您可以遍历sigantures数组。但是,你不知道signatures数组中每个签名的长度。

你可以通过在每个签名的第一个元素中编码长度来解决这个问题:

static const unsigned __int8 jpg[] = { 4, 0xFF, 0xD8, 0xFF, 0xDB };
static const unsigned __int8 png[] = { 8, 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A };

static const unsigned __int8 *signatures[] = { jpg, png };

bool isImg(bool * value)
{
  for(int i = 0; i < (sizeof (signatures)) / (sizeof (__int8*)); i++)
  {
    const unsigned __int8 *signature = signatures[i];
    int signaturesize = signature[0]; // here: 4 for i==0, 8 for i==1

        // use signature[i] which is array of bytes { 0xFF, Ox... }
        // check signature
  }
}