1

我不想问这个,因为我认为这一定很琐碎。但作为一个习惯于高级语言的人,这是一个真正的问题。

我有一个 C++ 程序,它使用 PDFium 生成 PDF 的图像。我有一个 C# 程序,它通过命名管道与 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 位以外的数据,我只是不知道如何处理它。我必须将数据放入一个字符数组中。

正如我已经说过的,我认为这是非常微不足道的。但是,虽然我知道问题出在哪里,但我根本不知道如何解决它。

非常感谢和问候

迈克尔

编辑:C#代码。它的一切,但完美。但我很确定这个问题出在 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 KB 都被复制到该位置。我知道,但我不明白 PDFium 源应该如何知道字符串是否在 373 个字符后终止。

嗯... PDFium-sources 知道它,因为我必须通过长度。这是由

size_t len = PDFData.length();

因此当然只有 373 个字节。

4

3 回答 3

2

C/C++ 使用空字符'\0'来终止char*字符串。因此,任何库函数(即strlen(),strncpy()等)将使用空字符作为隐式的字符串结束指示符。您的代码显然在某处执行此操作。相反,使用更类似于memcpy()std::vector<char>具有显式数据长度的 a 。

于 2014-10-10T13:03:17.967 回答
1

看看string:assignhttp://www.cplusplus.com/reference/string/string/assign/

字符串赋值运算符 fromchar *使用 C 风格的字符串结尾约定。您需要“缓冲区”assign调用:

string& assign (const char* s, size_t n);

这将包括任何NULs。

话虽如此,字节向量确实可能是一个更好的选择。

于 2014-10-10T13:14:14.737 回答
0

实际上,这从来都不是真正的问题。我刚刚把我的电线交叉了。虽然 chBuf 似乎在将其复制到 PDFData 之后或者当我读取它的值是 VS 时只有那些 373 个字节。所有约 20 KB 都被复制到该位置。我知道,但我不明白 PDFium 源应该如何知道字符串是否在 373 个字符后终止。

嗯... PDFium-sources 知道它,因为我必须通过长度。这是由

size_t len = PDFData.length();

因此当然只有 373 个字节。

很抱歉我用那些东西打扰了你

于 2014-10-10T13:56:23.890 回答