迭代字符串块以在C中构建新字符串的模式?

时间:2012-10-11 08:07:09

标签: c

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

  • 我有一个包含空字节的二进制字符串。
  • 我知道字符串的长度。
  • 我有一个函数(来自库)将字符串编码为另一种格式。
  • 我需要使用库函数对二进制字符串进行编码。
  • 库函数不接受长度&假设字符串是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字节。我可以编写一个相当可怕的循环,一直在data上调用strlen()并计数直到length字节已被编码,每次我需要编码更多字节时附加一个"\\0000"字符串,重新分配一些缓冲区以容纳每个额外的编码数据块。感觉这将是一个很多代码来解决一个相当简单的问题。来自具有split()(在nul字节上)map()(对每个块进行编码)和join()(使用"\\000")等概念的语言,我本能地想到了这种方式最干净的解决方案......但是标准C中没有任何东西可以用来做这样的事情。

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

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

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

2 个答案:

答案 0 :(得分:2)

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

  1. 查找所有嵌入的nul字节
  2. 从此和长度可以计算新字符串的长度
  3. 分配计算长度的新字符串
  4. 迭代复制所有非空字符的二进制字符串,当到达一个空字符时插入特殊字符序列
  5. 终止新字符串
  6. 使用新字符串调用库函数
  7. 释放新字符串

答案 1 :(得分:1)

你可以做的简单事情就是replace null byte直到最后一个空的长度(字符串终结符)。一旦你替换了nulls,那么你可以用替换的字符串做你想做的事。