我有以下代码:
framingStatus compressToFrame(char* inputBuffer, size_t inputBufferLength, char* frame, size_t* frameLength)
{
dword crc32 = GetMaskedCrc(inputBuffer,inputBufferLength);
size_t length = snappy_max_compressed_length(inputBufferLength);
char* compressed = (char*)malloc(length);
snappy_status status = snappy_compress(inputBuffer,inputBufferLength,compressed,&length);
if( status!=SNAPPY_OK )
return FS_ERROR;
frame[0] = 0x00; // Typ ramki skompresowany
frame[1] = length&0xff;
frame[2] = (length&0xff00)>>8;
frame[3] = (length&0xff00)>>16;
frame[4] = crc32&0xff;
frame[5] = (crc32&0xff00)>>8;
frame[6] = (crc32&0xff0000)>>16;
frame[7] = (crc32&0xff000000)>>24;
frame[8] = '\0'; // Pomoc dla strcat
strcat(frame,compressed);
*frameLength = length+8;
free(compressed);
return FS_OK;
}
在调用此函数之前,我为缓冲区命名帧分配内存。一切正常,但是分配指令frame[x] = ...
似乎没有向缓冲区写frame
和strcat
将任何compressed
数据连接到空缓冲区而没有我需要的标头。
为什么要分配说明frame[x] = ...
等,不给出任何结果?
[编辑:] 如果我想将帧头与压缩数据连接起来,你能建议我必须使用哪个函数吗?
[EDIT2:] 下面的代码工作正常。
framingStatus compressToFrame(char* inputBuffer, size_t inputBufferLength, char* frame, size_t* frameLength)
{
dword crc32 = GetMaskedCrc(inputBuffer,inputBufferLength);
size_t length = snappy_max_compressed_length(inputBufferLength);
char* compressed = (char*)malloc(length);
snappy_status status = snappy_compress(inputBuffer,inputBufferLength,compressed,&length);
if( status!=SNAPPY_OK )
return FS_ERROR;
frame[0] = 0x00; // Typ ramki skompresowany
frame[1] = length;
frame[2] = length >> 8;
frame[3] = length >> 16;
frame[4] = crc32;
frame[5] = crc32 >>8;
frame[6] = crc32 >>16;
frame[7] = crc32 >>24;
memcpy(&frame[8],compressed,length);
*frameLength = length+8;
free(compressed);
return FS_OK;
}
答案 0 :(得分:3)
你有
frame[0] = 0x00;
与
相同frame[0] = '\0';
无论您在第一个字符后添加什么内容,frame
都会成为0
长度字符串。
答案 1 :(得分:1)
strcat
用于字符串,而不是一般的二进制字节。由于frame
第一个字节为零,strcat
将从compressed
开始复制frame[0]
,并在compressed
中看到零时停止复制。
请尝试memcpy
。
memcpy(&frame[8], compressed, length);
此外,由于frame
的长度作为参数传递,您可能希望检查要复制到frame
的总长度,以确保没有非法覆盖那种情况。
答案 2 :(得分:1)
正如其他人已经指出的那样,你使用二进制数据而不是文本字符串。因此,此处strcat
功能不合适,请改用memcpy
。
此外,您应该使用unsigned char
而不是普通char
。
此外,您不需要在转移之前屏蔽值
frame[2] = (length&0xff00)>>8;
可能只是
frame[2] = length >> 8;
在这种情况下,它甚至是错误的
frame[3] = (length&0xff00)>>16;
同样在这里
frame[5] = crc32 >> 8;
frame[6] = crc32 >> 16;
frame[7] = crc32 >> 24;
答案 3 :(得分:0)
frame[0] = 0x00;
会将第一个字符作为字符串字符的结尾,因此字符串frame
为空。
frame[0] = 0x00;
与写作相同,
frame[0] = '\0';