我不想问这个,因为我认为这一定是非常微不足道的。但作为习惯于高级语言的人,这是一个真正的问题。
我有一个C ++程序,它使用PDFium生成一个PDF图像。我有一个C#程序,通过Named Pipes与C ++程序通信。 PDF文件(保存为字节数组)由管道传输。这是我的问题。
在第374位流的位置是一个NUL字节(00)并且我太愚蠢以不知何故到达它之后的数据。
这是我的代码:
LPTSTR lpszPipename2 = TEXT("\\\\.\\pipe\\myNamedPipe2");
hPipe2=CreateFile(lpszPipename2, GENERIC_READ, 0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
if(ReadFile( hPipe2, chBuf, dwBytesToRead, &cbRead, NULL))
{
PDFData = chBuf;
}
要读取的dwBytes是文件的大小,cbRead显示正确的数字。但PDFData只包含前373个字节。我检查了第373位以外的数据与立即窗口有关,我不知道如何处理它。 我必须将数据放入char数组中。
正如我已经说过的,我认为这是非常微不足道的。但是虽然我知道问题的来源,但我根本不知道如何解决它。
非常感谢和问候
迈克尔
编辑:C#-Code。它的一切都很完美。但我非常确定这个问题是在C ++方面。
public void SendRawData(byte[] data)
{
while (clientse == null || clientse.stream == null)
{ }
if (clientse.stream.CanWrite)
{
clientse.stream.Write(data, 0, data.Length);
clientse.stream.Flush();
}
}
private void ListenForClients()
{
while (true)
{
clientHandle = CreateNamedPipe(this.pipeName, DUPLEX | FILE_FLAG_OVERLAPPED, 0, 255, BUFFER_SIZE, BUFFER_SIZE, 0, IntPtr.Zero);
//could not create named pipe
if (clientHandle.IsInvalid)
return;
int success = ConnectNamedPipe(clientHandle, IntPtr.Zero);
//could not connect client
if (success == 0)
return;
clientse = new Client();
clientse.handle = clientHandle;
clientse.stream = new FileStream(clientse.handle, FileAccess.ReadWrite, BUFFER_SIZE, true);
if (ClientType == 0)
{
Thread readThread = new Thread(new ThreadStart(Read));
readThread.Start();
}
}
}
"溶液": 实际上,这绝不是一个真正的问题。我刚刚穿过电线。虽然chBuf似乎在将其复制到PDFData之后,或者当我读取它的值时,VS只有那些373个字节。所有~20千字节被复制到该位置。 我知道,但我不明白PDFium来源应该知道如果字符串在373个字符之后终止。
嗯...... PDF源知道它因为我必须通过长度。
确定了哪个size_t len = PDFData.length();
因此当然只有373个字节。
答案 0 :(得分:2)
C / C ++使用空字符'\0'
来终止char*
个字符串。因此,任何库函数(即strlen()
,strncpy()
,等)都将使用空字符作为隐式字符串结尾指示符。你的代码显然是在某处做的。相反,请使用具有明确数据长度的memcpy()
或std::vector<char>
更多内容。
答案 1 :(得分:1)
查看string:assign
(http://www.cplusplus.com/reference/string/string/assign/)
来自char *
的字符串赋值运算符使用C样式的字符串结尾约定。您需要“缓冲”assign
调用:
string& assign (const char* s, size_t n);
这将包括任何NUL
s。
话虽如此,字节向量可能确实是更好的选择。
答案 2 :(得分:0)
实际上,这绝不是一个真正的问题。我刚刚穿过电线。虽然chBuf似乎在将其复制到PDFData之后,或者当我读取它的值时,VS只有那些373个字节。所有~20千字节被复制到该位置。我知道这一点,但我不明白如果字符串在373个字符后终止,PDFium来源应该如何知道。
嗯...... PDF源知道它因为我必须通过长度。
确定了哪个size_t len = PDFData.length();
因此当然只有373个字节。
对不起,我用那些东西打扰了你