【问题标题】:Buffer error on using compress使用压缩时出现缓冲区错误
【发布时间】:2015-04-21 20:54:14
【问题描述】:

按照here 的示例后,我似乎失败了。

#define CHECK_ERR(retcode, msg) { \                                             
  if (retcode != Z_OK) { \                                                      
    fprintf(stderr, "%s on using %s\r\n", zError(retcode), msg); \              
    exit(1); \                                                                  
  } \                                                                           
}

int main(int argc, char* argv[]) { 
  Bytef a[1000];                                                                
  Bytef b[1000];                                                                
  Bytef c[1000];                                                                
  uLongf compressed_size;                                                       
  uLongf uncompressed_size;                                                     
  int retcode;                                                                  
  size_t i;                                                                     

  uncompressed_size = 800;                                                      
  for (i = 0; i < uncompressed_size; i++) {                                     
    a[i] = ((uint8_t)i) & 255;                                                  
  }                                                                             

  retcode = compress(b, &compressed_size, a, uncompressed_size);                
  CHECK_ERR(retcode, "compress");                                               
  retcode = uncompress(c, &uncompressed_size, b, compressed_size);              
  CHECK_ERR(retcode, "uncompress"); 
}

我收到缓冲区错误:Z_BUF_ERROR (-5)

程序返回:

buffer error on using compress

【问题讨论】:

  • 你有什么错误?
  • 错误更明确
  • 请准确说出程序输出的内容。你的代码应该告诉它是在compress 还是uncompress,对吧?

标签: c linux zlib


【解决方案1】:

我没有错误。我必须在顶部添加:

#include <stdio.h>
#include <stdlib.h>
#include "zlib.h"

【讨论】:

    【解决方案2】:

    我已经编辑了您的问题,添加了必需的内容。 值得一提的是,-lz 也应该提供给链接器。 我已经检查过您确实收到此代码错误。
    但是替换

      Bytef a[100];
      Bytef b[100];                                                                
      Bytef c[100];
    

      Bytef *a = calloc(100, sizeof(Bytef));
      Bytef *b = calloc(100, sizeof(Bytef));
      Bytef *c = calloc(100, sizeof(Bytef));
      if (NULL == a || NULL == b || NULL == c) exit(1);      
    

    并添加调试

      for (i = 0; i < uncompressed_size; i++) {
        a[i] = ((uint8_t)i) & 255;
        printf("%d ", a[i]);
      }
      printf("\n");
      retcode = compress(b, &compressed_size,(const Bytef*) a, uncompressed_size);
      CHECK_ERR(retcode, "compress");
      for (i = 0; i < compressed_size; i++) {
        printf("%d ", b[i]);
      }
      printf("\n");
      retcode = uncompress(c, &uncompressed_size, b, compressed_size);
      CHECK_ERR(retcode, "uncompress");
      for (i = 0; i < uncompressed_size; i++) {
        printf("%d ", c[i]);
      }
    

    正确:

    0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 
    120 156 99 96 100 98 102 97 101 99 231 224 228 226 230 225 229 227 23 16 20 18 6 0 5 70 0 191 
    0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 
    

    【讨论】:

    • 亲爱的反对者,您愿意解释一下出了什么问题吗?我假设您自己测试了 OP 的问题并找到了更好的解释,所以我很高兴听到它。
    • 我不是反对者,但我尝试了您的确切代码,但它也以同样的方式失败了。
    • 您应该解释您的答案应该如何解决问题。 zlib 没有理由不能在堆栈缓冲区上工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-31
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-02
    相关资源
    最近更新 更多