如何从 TYPE_MIME_PART 项中读取数据?
How do I read the data from a TYPE_MIME_PART item?
有点用,但问题是 MIME_PART 结构似乎没有初始化?它的所有属性都具有相同的值,即使我尝试打开不同的 mime 项目也是如此。
MIME_PART *pMime;
DHANDLE hPart;
char *pText;
WORD textLen;
if (error = NSFMimePartGetPart(bidLinksItem, &hPart)) {
goto exit;
}
pMime = OSLock(MIME_PART, hPart);
textLen = (pMime->wByteCount) - pMime->wHeadersLen - pMime->wBoundaryLen;
pText = (char *)pMime + sizeof(MIME_PART) + wHeadersLen;
char *itemText = (char *)malloc(textLen);
memcpy(itemText, pText, textLen);
itemText[textLen] = '[=11=]';
OSUnlock(hPart);
itemText 字符串包含大部分内容,但由于 MIME_PART 结构未正确设置,指向文本的指针已关闭...
那么如何正确设置MIME_PART?
回答错误,但评论可能有用。我的另一个答案更正确。
这个问题可以改进。例如,您可以显示一些示例数据并描述当您尝试使用您的代码读取该数据时的结果。
不过我会尽量根据我掌握的信息来回答。您这样计算文本长度:
textLen = (pMime->wByteCount) - pMime->wHeadersLen - pMime->wBoundaryLen;
我觉得这很合适,但你这样做:
pText = (char *)pMime + sizeof(MIME_PART) + wHeadersLen;
wHeadersLen
能保证等于pMime->wHeadersLen
吗?另外,您没有考虑边界长度。你不应该这样计算地址吗?
pText = (char *)pMime + sizeof(MIME_PART) + pMime->wHeadersLen + pMime->wBoundaryLen;
您的代码应该改为执行以下操作:
DHANDLE hPart;
char *pchPart;
if (error = NSFMimePartGetPart(bidLinksItem, &hPart)) {
goto exit;
}
pchPart = OSLock(char, hPart);
换句话说,将句柄锁定为 char
类型而不是 MIME_PART
类型。此时,pchPart
指向原始零件数据的开始——以边界(如果存在)和 headers 开始。您可以使用 NSFMimePartGetInfoByBLOCKID
来获取边界的长度和 headers.
我意识到这与 the documentation 相矛盾,但我已与主题专家确认:文档有误。
有点用,但问题是 MIME_PART 结构似乎没有初始化?它的所有属性都具有相同的值,即使我尝试打开不同的 mime 项目也是如此。
MIME_PART *pMime;
DHANDLE hPart;
char *pText;
WORD textLen;
if (error = NSFMimePartGetPart(bidLinksItem, &hPart)) {
goto exit;
}
pMime = OSLock(MIME_PART, hPart);
textLen = (pMime->wByteCount) - pMime->wHeadersLen - pMime->wBoundaryLen;
pText = (char *)pMime + sizeof(MIME_PART) + wHeadersLen;
char *itemText = (char *)malloc(textLen);
memcpy(itemText, pText, textLen);
itemText[textLen] = '[=11=]';
OSUnlock(hPart);
itemText 字符串包含大部分内容,但由于 MIME_PART 结构未正确设置,指向文本的指针已关闭...
那么如何正确设置MIME_PART?
回答错误,但评论可能有用。我的另一个答案更正确。
这个问题可以改进。例如,您可以显示一些示例数据并描述当您尝试使用您的代码读取该数据时的结果。
不过我会尽量根据我掌握的信息来回答。您这样计算文本长度:
textLen = (pMime->wByteCount) - pMime->wHeadersLen - pMime->wBoundaryLen;
我觉得这很合适,但你这样做:
pText = (char *)pMime + sizeof(MIME_PART) + wHeadersLen;
wHeadersLen
能保证等于pMime->wHeadersLen
吗?另外,您没有考虑边界长度。你不应该这样计算地址吗?
pText = (char *)pMime + sizeof(MIME_PART) + pMime->wHeadersLen + pMime->wBoundaryLen;
您的代码应该改为执行以下操作:
DHANDLE hPart;
char *pchPart;
if (error = NSFMimePartGetPart(bidLinksItem, &hPart)) {
goto exit;
}
pchPart = OSLock(char, hPart);
换句话说,将句柄锁定为 char
类型而不是 MIME_PART
类型。此时,pchPart
指向原始零件数据的开始——以边界(如果存在)和 headers 开始。您可以使用 NSFMimePartGetInfoByBLOCKID
来获取边界的长度和 headers.
我意识到这与 the documentation 相矛盾,但我已与主题专家确认:文档有误。