我正在尝试将一些数据正确发送到外部程序。如果我一次性遍历整个编码字符串,数据将被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实际上是编码数据的长度,而不是原始图像字节长度(到达此函数时)。
答案 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);