C# 有没有什么方法能够从二进制文件中直接读取数据,指向Intptr指针。。谢谢

解决方案 »

  1.   

    二进制文件就是文件流了,FileStream的对象 所在堆中指向的地址,就是文件流的首地址,这个流的具体内容在栈中的
      

  2.   


    我从文件中需要分段读数据现在用的方法是每一段时间将1920*1080*4这么多字节的数据读到一个byte数组中,然后copy到Intptr有没有什么方法直接将文件流中 要读的内容 直接指向Intptr??
      

  3.   

    以二进制打开的文件本身就相当于这样的一个指针。Stream有seek。你可随意移动。
      

  4.   


    C++里面有 fread(void* buffer, 1920*1080*4, 1, fp);这种方法那C#里面有没有类似的呢???现在用读到byte数组,然后拷贝的方法,太慢了
      

  5.   

    C++那个fread方法也是在往数组里面拷贝啊,没什么不同。
      

  6.   


    C++的fread方法是直接读出来1920*1080*4那么多字节的数据,然后指向指针,就可以直接用了C#的read是先读到一个byte[]数组里面,然后再用Marshal.Copy(byte[],0,Intptr,1920*1080*4)的方法复制到内存指针能不能直接读到内存指针里呢
      

  7.   

    关键是你的Intptr是什么?Marshal.Copy(byte[],0,Intptr,1920*1080*4)这步完全可以换种写法,直接让Intptr的地址执行之前的byte[],这样就实现了你的目的。
      

  8.   

    直接让Intptr的地址指向之前的byte[],这样就实现了你的目的。
      

  9.   


    我的Intptr就是一个数据缓冲区的指针,我是要改一段C++的代码,在C++里面就是一个void*类型的指针。除了copy,还有什么方法能让Intptr直接指向byte[]呢。
      

  10.   

    我无语了,还以为你的Intptr是一个结构体呢,缓冲区指针不就是byte[]的引用本身吗?那你又何必Marshal.Copy,直接用byte[]继续操作就可以了,你是修改C++代码,但是你不能还用C++的思维方式,在C#里面,对byte[]直接操作,起效果相当于C++的void*类型的指针,而且还比C++的容易理解,你根本不必也不应该去转换为所谓的指针。
      

  11.   


    我还是贴代码吧。
    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);
      

  12.   

    你这里的m_videoBufferL其实应该给一个byte[]类型的变量的,输出直接是一个数组,改造那个接口调用方式试试,应该可以。
      

  13.   


    这个接口是别人的api就算改了之后别的地方也有用到的,变动有点儿大啊。。太太太坑爹了。。
      

  14.   

    如果实在不行,那个部分就用C++二次封装下,你读取文件只要传递一个文件路径即可,那么从文件读取到缓冲区就由C++代码实现,然后C#调用这个C++写的函数,只要传递文件名和一些控制参数,让C++来实现缓冲区的填充。