Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;字符串的长度超过几个NUL字节_C++_Nul - Fatal编程技术网

C++ C++;字符串的长度超过几个NUL字节

C++ C++;字符串的长度超过几个NUL字节,c++,nul,C++,Nul,我不想问这个问题,因为我认为这一定很琐碎。但对于习惯高级语言的人来说,这是一个真正的问题 我得到了一个C++程序,它使用PDFIUM来生成一个PDF图像。我有一个C程序,它通过命名管道与C++程序通信。PDF文件(保存为字节数组)通过管道传输。这是我的问题 在流的第374个位置是一个NUL字节(00),我太笨了,无法以某种方式到达它后面的数据 这是我的密码: LPTSTR lpszPipename2 = TEXT("\\\\.\\pipe\\myNamedPipe2"); hPipe2=Cre

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

我得到了一个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 to read是文件的大小,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千字节被复制到该位置。 我知道这一点,但我不明白如果字符串在373个字符后终止,PDFium源如何知道这一点

嗯。。。PDFium来源知道这一点,因为我必须通过长度。这是由

size_t len = PDFData.length();

因此当然只有373字节。

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

查看
string:assign
()

char*
中的字符串赋值运算符使用C样式的字符串结束约定。您需要“缓冲区”
assign
调用:

string& assign (const char* s, size_t n);
这将包括任何
NUL
s


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

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

嗯。。。PDFium来源知道这一点,因为我必须通过长度。这是由

size_t len=PDFData.length()

因此当然只有373字节


很抱歉,我用这些东西打扰了您

您没有使用由
strlen
lstrlen
设计的数据长度将此数据发送到此管道的写入端,对吗?您刚才描述的内容至少听起来像是在发送一个包含嵌入式
0x00
字节的粘液滴。在管道的任何一边使用C字符串API都是徒劳的。坦白地说,在这个问题上,没有足够的数据来精确地回答这个问题。如果我理解正确的话,你是对的。写入端是一个C#程序,atm只通过框架标准方法读取文件,并通过调用PDFData获取长度。长度然后由起始端传输arguments@Michael请在这个问题上加上C代码。我再看几遍你的帖子,给我一点时间。您说过
cbRead
精确到C#端生成的PDF中的字节数。如果是这种情况,您只需要停止使用标准库中的字符串API,并使用更面向八位字节(而不是
char
)的容器来传递数据。在发送方也可以保证一个长度前导,以便为即将到来的内容准备接收方。+1我会使用
std::vector
,因为它只是八位字节,不一定是
char
数据,但这个想法仍然是准确的,值得一提。