C# 有没有什么方法读取二进制文件的数据直接指向Intptr指针的?? C# 有没有什么方法能够从二进制文件中直接读取数据,指向Intptr指针。。谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 二进制文件就是文件流了,FileStream的对象 所在堆中指向的地址,就是文件流的首地址,这个流的具体内容在栈中的 我从文件中需要分段读数据现在用的方法是每一段时间将1920*1080*4这么多字节的数据读到一个byte数组中,然后copy到Intptr有没有什么方法直接将文件流中 要读的内容 直接指向Intptr?? 以二进制打开的文件本身就相当于这样的一个指针。Stream有seek。你可随意移动。 C++里面有 fread(void* buffer, 1920*1080*4, 1, fp);这种方法那C#里面有没有类似的呢???现在用读到byte数组,然后拷贝的方法,太慢了 C++那个fread方法也是在往数组里面拷贝啊,没什么不同。 C++的fread方法是直接读出来1920*1080*4那么多字节的数据,然后指向指针,就可以直接用了C#的read是先读到一个byte[]数组里面,然后再用Marshal.Copy(byte[],0,Intptr,1920*1080*4)的方法复制到内存指针能不能直接读到内存指针里呢 关键是你的Intptr是什么?Marshal.Copy(byte[],0,Intptr,1920*1080*4)这步完全可以换种写法,直接让Intptr的地址执行之前的byte[],这样就实现了你的目的。 直接让Intptr的地址指向之前的byte[],这样就实现了你的目的。 我的Intptr就是一个数据缓冲区的指针,我是要改一段C++的代码,在C++里面就是一个void*类型的指针。除了copy,还有什么方法能让Intptr直接指向byte[]呢。 我无语了,还以为你的Intptr是一个结构体呢,缓冲区指针不就是byte[]的引用本身吗?那你又何必Marshal.Copy,直接用byte[]继续操作就可以了,你是修改C++代码,但是你不能还用C++的思维方式,在C#里面,对byte[]直接操作,起效果相当于C++的void*类型的指针,而且还比C++的容易理解,你根本不必也不应该去转换为所谓的指针。 我还是贴代码吧。CreateVideoFrame是创建一个视频帧m_videoFrame;GetBytes是得到 该视频帧的数据缓冲区指针;后面的就是读数据,指向这个缓冲区了。if (m_deckLinkOutput->CreateVideoFrame(m_frameWidth,m_frameHeight,m_frameWidth * 4, bmdFormat10BitRGB, bmdFrameFlagDefault, &m_videoFrame) != S_OK) { printf("error2\n"); goto bail; }m_videoFrame->GetBytes((void**)&m_videoBuffer); //得到视频帧缓冲区的指针fseek(fp, videoFramePos[xxxx] - videoFramePos[xxxx - 1] - 1920*1080*4, SEEK_CUR);fread(m_videoBuffer,1920*1080*4,1,fp);m_deckLinkOutput->ScheduleVideoFrame(m_videoFrame, (m_totalFramesScheduled * m_frameDuration), m_frameDuration, m_frameTimescale); xxxx++;m_videoFrameL.GetBytes(out m_videoBufferL);fsL.Seek(listVideoFramePosL[m_playedFrames] - listVideoFramePosL[(int)m_playedFrames - 1] - m_videoBufferSize, SeekOrigin.Current); fsL.Read(tempBuffer1, 0, m_videoBufferSize);Marshal.Copy(tempBuffer1, 0, m_videoBufferL, m_videoBufferSize);m_deckLinkOutput.ScheduleVideoFrame(m_videoFrameL, (m_totalFramesScheduled * m_frameDuration), m_frameDuration, m_frameTimescale); 你这里的m_videoBufferL其实应该给一个byte[]类型的变量的,输出直接是一个数组,改造那个接口调用方式试试,应该可以。 这个接口是别人的api就算改了之后别的地方也有用到的,变动有点儿大啊。。太太太坑爹了。。 如果实在不行,那个部分就用C++二次封装下,你读取文件只要传递一个文件路径即可,那么从文件读取到缓冲区就由C++代码实现,然后C#调用这个C++写的函数,只要传递文件名和一些控制参数,让C++来实现缓冲区的填充。 Winform窗体的两项设置 如何让C#与网页中的JS互动,要调用JS [分享]一个基于WPF的语法高亮控件. progressbar??? 关于TextBox回车后中文变成全角问题 如何将文本文件转换成数据矩阵,求源代码 richTextBox里内容的打印? 多线程之间共同调用一个文件时,如何处理? 急求,C#中的分页函数是什么? 无题 求高手!关于smtp服务器发送邮件的问题。 c/s winform 图片存放问题
我从文件中需要分段读数据现在用的方法是每一段时间将1920*1080*4这么多字节的数据读到一个byte数组中,然后copy到Intptr有没有什么方法直接将文件流中 要读的内容 直接指向Intptr??
C++里面有 fread(void* buffer, 1920*1080*4, 1, fp);这种方法那C#里面有没有类似的呢???现在用读到byte数组,然后拷贝的方法,太慢了
C++的fread方法是直接读出来1920*1080*4那么多字节的数据,然后指向指针,就可以直接用了C#的read是先读到一个byte[]数组里面,然后再用Marshal.Copy(byte[],0,Intptr,1920*1080*4)的方法复制到内存指针能不能直接读到内存指针里呢
我的Intptr就是一个数据缓冲区的指针,我是要改一段C++的代码,在C++里面就是一个void*类型的指针。除了copy,还有什么方法能让Intptr直接指向byte[]呢。
我还是贴代码吧。
CreateVideoFrame是创建一个视频帧m_videoFrame;
GetBytes是得到 该视频帧的数据缓冲区指针;
后面的就是读数据,指向这个缓冲区了。
if (m_deckLinkOutput->CreateVideoFrame(m_frameWidth,m_frameHeight,m_frameWidth * 4, bmdFormat10BitRGB, bmdFrameFlagDefault, &m_videoFrame) != S_OK)
{
printf("error2\n");
goto bail;
}m_videoFrame->GetBytes((void**)&m_videoBuffer); //得到视频帧缓冲区的指针fseek(fp, videoFramePos[xxxx] - videoFramePos[xxxx - 1] - 1920*1080*4, SEEK_CUR);
fread(m_videoBuffer,1920*1080*4,1,fp);m_deckLinkOutput->ScheduleVideoFrame(m_videoFrame, (m_totalFramesScheduled * m_frameDuration), m_frameDuration, m_frameTimescale);
xxxx++;m_videoFrameL.GetBytes(out m_videoBufferL);fsL.Seek(listVideoFramePosL[m_playedFrames] - listVideoFramePosL[(int)m_playedFrames - 1] - m_videoBufferSize, SeekOrigin.Current);
fsL.Read(tempBuffer1, 0, m_videoBufferSize);
Marshal.Copy(tempBuffer1, 0, m_videoBufferL, m_videoBufferSize);m_deckLinkOutput.ScheduleVideoFrame(m_videoFrameL, (m_totalFramesScheduled * m_frameDuration), m_frameDuration, m_frameTimescale);
这个接口是别人的api就算改了之后别的地方也有用到的,变动有点儿大啊。。太太太坑爹了。。