2

我的问题标题不清楚,抱歉。我试过 ;)

  • 我有一个包含 nul 字节的二进制字符串。
  • 我知道字符串的长度。
  • 我有一个函数(来自库)将字符串编码为另一种格式。
  • 我需要使用库函数对二进制字符串进行编码。
  • 库函数不接受长度& 假定字符串为 nul 终止。
  • 我知道如何手动编码 nul 字节(将它们表示为"\\000"

取伪代码:

/* I have a string, and the length in bytes of that string */
char * data   = value->bytes;
long   length = value->length;

/* I need to use a function, but it doesn't handle embedded nuls */
char * encoded = lib_func_encode(data);
lib_free(encoded); // library function requires a free() routine be called

是行不通的,因为库函数只对第data一个 nul 字节的第一个块进行编码。我可以编写一个相当可怕的循环,不断调用 strlen()data并计数,直到length字节被编码,"\\0000"每次我需要编码更多字节时附加一个字符串,重新分配一些缓冲区以容纳每个额外的编码数据块。感觉这将是很多代码来解决一个相当简单的问题。来自具有split()(在 nul 字节上)map()(对每个块进行编码)和join()(使用"\\000")等概念的语言,我本能地考虑以这种方式最干净的解决方案......但标准 C 中没有真正存在做这样的事情。

在虚构的函数式语言中,它可能看起来像:

join("\\000",
     map(lambda(chunk){encode(chunk)}, split('\0', data)))

一个经验丰富的 C 程序员如何编写我需要编写的例程?

4

2 回答 2

2

您可以分多个步骤执行此操作:

  1. 查找所有嵌入的 nul 字节
  2. 从这个和长度你可以计算一个新字符串的长度
  3. 分配计算长度的新字符串
  4. 遍历复制所有非空字符的二进制字符串,当到达空字符时插入特殊字符序列
  5. 终止新字符串
  6. 使用新字符串调用库函数
  7. 释放新字符串
于 2012-10-11T08:17:02.410 回答
1

您可以做的最简单的事情就是replacenull bytes 增加到不包括最后一个 null(字符串终止符)的长度。一旦你替换了nulls,你就可以用替换的字符串做你想做的事。

于 2012-10-11T08:35:36.023 回答