我想使用字节对编码来解压缩字节数组。我有源代码(不是来自我)使用文件流逐字节读取文件。但是,我想解压缩char *
。
我一直在尝试使用stringstream和其他东西来转换它,但我无法弄清楚如何做到这一点。
我想像这样使用它:expand(char *inputarray, char *outputarray)
我是c ++的新手,刚从vb.net切换,所以不要对我太过刻苦:)
这是代码:
/* expand.c */
/* Copyright 1994 by Philip Gage */
#include <stdio.h>
/* decompress data from input to output */
void expand (FILE *input, FILE *output)
{
unsigned char left[256], right[256], stack[30];
short int c, count, i, size;
/* unpack each block until end of file */
while (( count = getc ( input )) != EOF )
{
/* set left to itself as literal flag */
for ( i = 0 ; i < 256; i++ )
{
left[i] = i;
}
/* read pair table */
for ( c = 0 ; ; )
{
/* skip range of literal bytes */
if ( count > 127 )
{
c += count -127;
count = 0;
}
if ( c==256 )
{
break;
}
/* read pairs, skip right if literal */
for ( i = 0; i <= count; i++, c++ )
{
left[c] = getc(input);
if ( c != left[c] )
{
right[c] = getc(input);
}
}
if (c == 256)
{
break;
}
count = getc(input);
}
/* calculate packed data block size */
size = 256 * getc(input) + getc(input);
/* unpack data block */
for ( i = 0 ; ; )
{
/* pop byte from stack or read byte */
if ( i )
{
c = stack[--i];
}
else
{
if ( !size--)
{
break;
}
c = getc(input);
}
/* output byte or push pair on stack */
if ( c == left[c] )
{
putc(c, output);
}
else
{
stack[i++] = right[c];
stack[i++] = left[c];
}
}
}
}
void main ( int argc, char *argv[] )
{
FILE *infile, *outfile;
if ( argc != 3 )
{
printf("Usage: expand infile outfile\n");
}
else
{
if (( infile = fopen(argv[1],"rb"))==NULL)
{
printf("Error opening input %s\n",argv[1]);
}
else
{
if ((outfile=fopen(argv[2],"wb"))==NULL)
{
printf("Error opening output %s\n", argv[2]);
}
else
{
expand ( infile, outfile );
fclose ( outfile );
fclose ( infile );
}
}
}
}
/* end of file */
答案 0 :(得分:1)
我想这就是你想做的。函数str_getc()
和str_putc()
等同于putc(int , FILE *)
和getc(FILE *)
int sCtr = 0, dCtr = 0;
int str_getc(char *str) { return str[sCtr++]; } //char * equivalent of getc()
void str_putc(int c, char *str) { str[dCtr++] = c; } //char * equivalent of putc()
void expand (char *input, char *output)
{
unsigned char left[256], right[256], stack[30];
short int c, count, i, size;
/* unpack each block until end of file */
while (( count = str_getc ( input )) != -1)
{
/* set left to itself as literal flag */
for ( i = 0 ; i < 256; i++ )
{
left[i] = i;
}
/* read pair table */
for ( c = 0 ; ; )
{
/* skip range of literal bytes */
if ( count > 127 )
{
c += count -127;
count = 0;
}
if ( c==256 )
{
break;
}
/* read pairs, skip right if literal */
for ( i = 0; i <= count; i++, c++ )
{
left[c] = str_getc(input);
if ( c != left[c] )
{
right[c] = str_getc(input);
}
}
if (c == 256)
{
break;
}
count = str_getc(input);
}
/* calculate packed data block size */
size = 256 * str_getc(input) + str_getc(input);
/* unpack data block */
for ( i = 0 ; ; )
{
/* pop byte from stack or read byte */
if ( i )
{
c = stack[--i];
}
else
{
if ( !size--)
{
break;
}
c = str_getc(input);
}
/* output byte or push pair on stack */
if ( c == left[c] )
{
str_putc(c, output);
}
else
{
stack[i++] = right[c];
stack[i++] = left[c];
}
}
}
}
/* end of file */
答案 1 :(得分:0)
所有C ++输入流都有一个get
函数,可以用来一次获取一个字符。输出流具有相应的put
函数。
只需在需要的地方更换。
当然,也可以使用正常的输入和输出运算符>>
和<<
。
如果你想直接处理数组,那么一旦你学会了如何处理指针,这也很容易。然后只需将输入和输出数组传递给函数,并在获取字节时使用,例如left[c] = *input++;
并在撰写时使用,例如*output++ = c;
。
您还可以使用标准C ++容器(如std::vector
)来存储数据。在这种情况下,您使用例如std::vector<char>
,并使用迭代器来获取和设置单个字符。
这实际上是非常基本的东西,你应该快速学习的东西。只需阅读有关指针,数组,C ++ standard I/O functionality和standard containers
的更多信息