我的问题标题不清楚,抱歉。我试过 ;)
- 我有一个包含 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 程序员如何编写我需要编写的例程?