C ++字符串超过几个NUL字节

时间:2014-10-10 12:55:53

标签: c++ nul

我不想问这个,因为我认为这一定是非常微不足道的。但作为习惯于高级语言的人,这是一个真正的问题。

我有一个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个字节。

3 个答案:

答案 0 :(得分:2)

C / C ++使用空字符'\0'来终止char*个字符串。因此,任何库函数(即strlen()strncpy())都将使用空字符作为隐式字符串结尾指示符。你的代码显然是在某处做的。相反,请使用具有明确数据长度的memcpy()std::vector<char>更多内容。

答案 1 :(得分:1)

查看string:assignhttp://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个字节。

对不起,我用那些东西打扰了你