写入已分配的char缓冲区

时间:2014-04-09 15:10:30

标签: c char

我有以下代码:

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] = ...似乎没有向缓冲区写framestrcat将任何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;
}

4 个答案:

答案 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';