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
数据,但这个想法仍然是准确的,值得一提。