gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:43:15 33 4
gpt4 key购买 nike

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

我有一个 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 源知道它,因为我必须传递长度。这是由

决定的
size_t len = PDFData.length();

因此当然只有 373 个字节。

最佳答案

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

关于C++ 字符串超过几个 NUL 字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26299988/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com