ZLib 和 memcpy
ZLib and memcpy
在Zlib算法中我们有解码功能。这个函数称为膨胀。在函数的末尾,我们需要将字节复制到输出。
示例:(full code)
if (copy > left) copy = left;
left -= copy;
state->length -= copy;
do {
*put++ = *from++;
} while (--copy);
if (state->length == 0) state->mode = LEN;
break;
case LIT:
if (left == 0) goto inf_leave;
在此示例中,我们执行了 while 循环,通过递增指针来复制字节。所以我们有 "copy" 次迭代。
我有疑问:为什么我们不能只使用 memcpy(put, from, copy) (然后递增指针)而不是循环?
为什么在某些情况下(按8kb块编码时)会出现错误的解码结果?
关于错误结果:在解码结果中我们可以有未初始化的字节(一点点)。好像 memcpy 从未初始化的内存中复制一些字节。
我无法使用 memcpy()
,也无法使用 memmove()
。原因是副本经常重叠,目的是复制 just-copied 字节。 memcpy()
对于重叠的源和目标块的行为是 未定义的 。 memmove()
在那种情况下的行为非常明确,但恰恰是 相反 所需要的,其中 memmove()
避免复制 just-copied 数据。
我不知道你做了什么导致了错误的结果,但是那里的副本永远不会从未初始化的内存中复制。
在Zlib算法中我们有解码功能。这个函数称为膨胀。在函数的末尾,我们需要将字节复制到输出。 示例:(full code)
if (copy > left) copy = left;
left -= copy;
state->length -= copy;
do {
*put++ = *from++;
} while (--copy);
if (state->length == 0) state->mode = LEN;
break;
case LIT:
if (left == 0) goto inf_leave;
在此示例中,我们执行了 while 循环,通过递增指针来复制字节。所以我们有 "copy" 次迭代。 我有疑问:为什么我们不能只使用 memcpy(put, from, copy) (然后递增指针)而不是循环? 为什么在某些情况下(按8kb块编码时)会出现错误的解码结果?
关于错误结果:在解码结果中我们可以有未初始化的字节(一点点)。好像 memcpy 从未初始化的内存中复制一些字节。
我无法使用 memcpy()
,也无法使用 memmove()
。原因是副本经常重叠,目的是复制 just-copied 字节。 memcpy()
对于重叠的源和目标块的行为是 未定义的 。 memmove()
在那种情况下的行为非常明确,但恰恰是 相反 所需要的,其中 memmove()
避免复制 just-copied 数据。
我不知道你做了什么导致了错误的结果,但是那里的副本永远不会从未初始化的内存中复制。