在c ++中用字符串创建字符串数组

时间:2014-01-21 18:37:53

标签: c++ arrays memcpy

我正在尝试将一些数据正确发送到外部程序。如果我一次性遍历整个编码字符串,数据将被base64编码为字符串并正确处理。但是,由于这些数据可能会变得非常大,我试图将数据分解为块状发送。

char* encodedBMPData = EncodeImage(hBitmap, info, m_currentImageLength);

int numOfChunks = (*m_currentImageLength / fiveMBByteSize);
long trailingLength = *m_currentImageLength - (numOfChunks * fiveMBByteSize);
if(trailingLength > 0)
    numOfChunks++; //One more chunk for trailing length

char **segmentedImageData = (char**)malloc(numOfChunks*sizeof(char*));

for(int i = 0; i < numOfChunks; i++)
{
    if((i+1) != numOfChunks)
    {
        segmentedImageData[i] = (char*)malloc(fiveMBByteSize * sizeof(char));
        long memorySpace = (i*fiveMBByteSize);
        memcpy(segmentedImageData[i], encodedBMPData + memorySpace, fiveMBByteSize);
    }
    else
    {
        segmentedImageData[i] = (char*)malloc(trailingLength * sizeof(char));
        long memorySpace = (i*fiveMBByteSize);
        memcpy(segmentedImageData[i], encodedBMPData + memorySpace, trailingLength);
    }
}

status = PostMessage(this->m_hMasterMessageWnd, WM_IMAGE_SEGMENTED_READY, (WPARAM)&numOfChunks, (LPARAM)segmentedImageData);
free(encodedBMPData);

至于为什么我使用字符串,对于你们好奇的人来说,这是在ActiveX控件中并将数据传递给Javascript。我测试了这个小图像尺寸,一次性传输所有内容(所以我只传递encodedBMPData)和它传递给它的javascript,它正常工作。如果我有一个小图像点击这个特定代码并在一个块中传输,它在服务器端尝试解码时仍会中断。

感谢你们给予的任何帮助。

修改 哦,因为我把它命名为可怕,我在这里说m_currentImageLength实际上是编码数据的长度,而不是原始图像字节长度(到达此函数时)。

1 个答案:

答案 0 :(得分:0)

<强>更新

我发现奇怪的东西之后才开始工作,当我们的服务器获取数据时,还有额外的4个字节被添加。如果在每个块的末尾添加空字符,则这4个字节将消失。我最好的理论是,如果没有添加空字符,javascript会对它做一些事情。

对于任何使用ActiveX控件的人,特别是TWAIN界面....请注意这一点,具体取决于您对图像数据的处理方式。

原帖 所以我还没有成功,每当我发送一个以上的数据块时,它都会失败。我相信这是一个不同的问题,在这一点上我不相信这是一个C ++问题。对不起,如果我没有指定C或C ++,我真的不在乎这种或那种方式。

这确实导致我清理代码以读取一点点并意识到如果将null添加到唯一/最后一个块的末尾,它可以工作(全部归功于我的同事)。希望我能弄清楚为什么null会突然变得有效。谢谢大家。

        m_currentImageLength = (int*)malloc(sizeof(int));
        encodedBMPData = EncodeImage(hBitmap, info, m_currentImageLength);

        //Image will need to be broken up into segments
        numOfChunks = (*m_currentImageLength / fiveMBByteSize);
        if ( *m_currentImageLength % fiveMBByteSize != 0)
            numOfChunks++; //One more chunk for trailing length

        encodedCurrentPosition = encodedBMPData;
        bytesRemaining = *m_currentImageLength;
        segmentedImageData = (char**)malloc(numOfChunks*sizeof(char*));

        for(int i = 0; i < numOfChunks; i++)
        {
            if(bytesRemaining > fiveMBByteSize)
            {
                segmentedImageData[i] = (char*)malloc(fiveMBByteSize * sizeof(char));
                memcpy(segmentedImageData[i], encodedCurrentPosition, fiveMBByteSize);
                encodedCurrentPosition += fiveMBByteSize;
                bytesRemaining -= fiveMBByteSize;
            }
            else
            {
                // Add an extra byte to add null character at end of string for last segment
                segmentedImageData[i] = (char*)malloc((bytesRemaining*sizeof(char)) + 1 );
                memcpy(segmentedImageData[i], encodedCurrentPosition, bytesRemaining);
                segmentedImageData[i][bytesRemaining] = '\0';
                break;
            }
        }

        status = PostMessage(this->m_hMasterMessageWnd, WM_IMAGE_SEGMENTED_READY, (WPARAM)&numOfChunks, (LPARAM)segmentedImageData);
        free(encodedBMPData);
        free(m_currentImageLength);