【问题标题】:Variable length structures可变长度结构
【发布时间】:2012-12-21 15:35:27
【问题描述】:

OMX 提供了一个结构如下定义

/* Parameter specifying the content URI to use. */
typedef struct OMX_PARAM_CONTENTURITYPE
{
OMX_U32 nSize;
/**< size of the structure in bytes */
OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
OMX_U8 contentURI[1];     /**< The URI name*/
}OMX_PARAM_CONTENTURITYPE;
OMX_IndexParamContentURI,
/**< The URI that identifies the target content. Data type is OMX_PARAM_CONTENTURITYPE. */

我有一个常量字符数组要设置。

char* filename = "/test.bmp";

据我了解,我需要以某种方式将 memcopy 文件名设置为 struct.contentURI,然后相应地更新 struct.size。我该怎么做?

最好的问候

【问题讨论】:

  • C 还是 C++?任选其一。
  • 谷歌'c struct hack'。你会被设置。这个问题一定是骗人的吧?
  • 到目前为止您尝试过什么?具体来说,您如何创建(分配)您的 OMX_PARAM_CONTENTURITYPE 实例?展示您的代码可以让我们减少对细节的猜测。
  • 卡尔,请写下你的答案作为回复,我可以接受!

标签: c++ c openmax


【解决方案1】:

首先你需要分配足够的内存来包含固定大小的部分和文件名:

size_t uri_size = strlen(filename) + 1;
size_t param_size = sizeof(OMX_PARAM_CONTENTURITYPE) + uri_size - 1;
OMX_PARAM_CONTENTURITYPE * param = malloc(param_size);

加 1 以包含终止字符,减 1 因为结构已包含一个字节的数组。

在 C++ 中,您需要强制转换,并且应该使用智能指针或向量来确保异常安全:

std::vector<char> memory(param_size);
OMX_PARAM_CONTENTURITYPE * param = 
    reinterpret_cast<OMX_PARAM_CONTENTURITYPE *>(&memory[0]);

然后你可以填写字段:

param->nSize = param_size;
param->nVersion = whatever;
memcpy(param->contentURI, filename, uri_size);

完成后不要忘记free(param)

【讨论】:

  • 我应该减去一个吗?终止 \0 呢?
  • 请记住,这是官方未定义的行为(我听说过调试实现会失败)。
  • @Stasik 这取决于库是否希望它被终止。我猜它没有,因为有一个长度字段使终止变得多余;但如果是这样,则不要减一,而是在复制的数量上加一(或者,等价地,在uri_size 上加一以在其中包含终止符)。
  • 抱歉,我不能假设您已经在 OMX 中阅读过“请注意,与其他可变长度结构一样,nSize 参数指示结构的总大小,包括 URI 名称。这包括任何必需的终止字节。”
  • @Stasik:不,我不熟悉图书馆。在这种情况下,我会相应地调整答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
  • 2023-03-04
  • 2015-08-09
  • 1970-01-01
  • 2014-11-14
相关资源
最近更新 更多