gpt4 book ai didi

c++ - LZO 压缩字符*

转载 作者:行者123 更新时间:2023-11-30 02:10:54 24 4
gpt4 key购买 nike

我已经在我的 Ubuntu 机器上安装了 LZO,我想使用 ti 来压缩一个 char* 类型的字符串。

在示例文件中,我找到了这个代码片段(我已经为我的应用程序对它进行了一些编辑):

  int r;
lzo_bytep in;
lzo_bytep out;
lzo_voidp wrkmem;
lzo_uint in_len;
lzo_uint out_len;
lzo_uint new_len;
int strToCompressLen; // I have added this

/*
* Step 1: initialize the LZO library
*/
if (lzo_init() != LZO_E_OK)
{
cout << "internal error - lzo_init() failed !!!" << endl;
cout << "(this usually indicates a compiler bug - try recompiling\nwithout optimizations, and enable '-DLZO_DEBUG' for diagnostics)" << endl;
//return 4;
}

// here I get the data I want to compress
char* imageData = (char*)imageIn->getFrame();

/*
* Step 2: allocate blocks and the work-memory
*/
strToCompressLen = strlen(imageData);
in = (lzo_bytep) xmalloc(strToCompressLen);
out = (lzo_bytep) xmalloc((strToCompressLen + strToCompressLen / 16 + 64 + 3));
wrkmem = (lzo_voidp) xmalloc(LZO1X_1_MEM_COMPRESS);
if (in == NULL || out == NULL || wrkmem == NULL)
{
cout << "out of memory" << endl;
//return 3;
}

/*
* Step 3: prepare the input block that will get compressed.
* We just fill it with zeros in this example program,
* but you would use your real-world data here.
*/
in_len = strToCompressLen;
lzo_memset(in,0,in_len);

/*
* Step 4: compress from 'in' to 'out' with LZO1X-1
*/
r = lzo1x_1_compress(in,in_len,out,&out_len,wrkmem);
if (r != LZO_E_OK)
{
/* this should NEVER happen */
cout << "internal error - compression failed: " << r << endl;
//return 2;
}
/* check for an incompressible block */
if (out_len >= in_len)
{
cout << "This block contains incompressible data." << endl;
//return 0;
}

但它所做的只是填充零。我需要压缩一个 char* 变量。

我想我需要编辑这些行:

  in_len = strToCompressLen;
lzo_memset(in,0,in_len);

我在这个变量中有我想要压缩的字符串:

  char* imageData = (char*)imageIn->getFrame();

我需要将其转换为其他类型吗?

LZO 的文档不是很有帮助(或者我可能无法正确使用它)。

最佳答案

主要有3个混淆点:

  1. 最好不要使用 char* 当指针指向的缓冲区是不是一个以 null 结尾的字符串令人困惑。
  2. strlen() 只会给你以 null 结尾的字符串的长度,它不会给你一个大小内存中的任意缓冲区。你需要在其他地方获取该信息。
  3. 你传递给的缓冲区lzo1x_1_compress() 实际上需要包含你想要的数据压缩而不是空缓冲区全是零。

假设您可以使用 imageIn->getFrameSizeBytes() 之类的方法从 imageIn 获取图像的大小,试试这个:

  int r;
lzo_bytep out;
lzo_voidp wrkmem;
lzo_uint out_len;
lzo_uint new_len;

/*
* Step 1: initialize the LZO library
*/
if (lzo_init() != LZO_E_OK)
{
cout << "internal error - lzo_init() failed !!!" << endl;
cout << "(this usually indicates a compiler bug - try recompiling\nwithout optimizations, and enable '-DLZO_DEBUG' for diagnostics)" << endl;
//return 4;
}

// here I get the data I want to compress
lzo_bytep imageData = (lzo_bytep) imageIn->getFrame();
size_t uncompressedImageSize = imageIn->getFrameSizeBytes();

/*
* Step 2: allocate blocks and the work-memory
*/
out = (lzo_bytep) xmalloc((uncompressedImageSize + uncompressedImageSize / 16 + 64 + 3));
wrkmem = (lzo_voidp) xmalloc(LZO1X_1_MEM_COMPRESS);
if (out == NULL || wrkmem == NULL)
{
cout << "out of memory" << endl;
//return 3;
}

/*
* Step 4: compress from 'imageData' to 'out' with LZO1X-1
*/
r = lzo1x_1_compress(imageData,uncompressedImageSize,out,&out_len,wrkmem);
if (r != LZO_E_OK)
{
/* this should NEVER happen */
cout << "internal error - compression failed: " << r << endl;
//return 2;
}

/* check for an incompressible block */
if (out_len >= uncompressedImageSize)
{
cout << "This block contains incompressible data." << endl;
//return 0;
}

不要忘记释放 wrkmem。更好的是,将 C++ 和 std::vector 用于工作内存,以便自动释放它。

关于c++ - LZO 压缩字符*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4219876/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com