精华内容
下载资源
问答
  • 读写二进制文件使用open函数? 各种组合seek()、read()和write()累不累? 使用 mmap 模块实现对文件的内存映射,让我们读写二进制文件像操作数组一样高效优雅。 先给出一个实用函数,用来演示如何打开一个...
    读写二进制文件还在使用open函数?
    各种组合seek()、read()和write()累不累?

    使用 mmap 模块实现对文件的内存映射,让我们读写二进制文件像操作数组一样高效优雅。


    先给出一个实用函数,用来演示如何打开一个文件并对它进行内存映射操作。

    def memory_map(filename, access=mmap.ACCESS_WRITE):
        size = os.path.getsize(filename)
        fd = os.open(filename, os.O_RDWR)
        return mmap.mmap(fd, size, access=access)
    

    要使用这个函数,需要先准备一个已经创建好的文件并为之填充一些数据。

    >>> size = 1000000
    >>> with open('data','wb') as f:
            f.seek(size-1)
            f.write(b'\x00')
    

    接着我们可以使用memory_map()函数对文件内容做内存映射,它返回的mmap对象可以让我们像操作数组一样读写二进制文件!

    >>> m = memory_map('data')
    >>> len(m)
    1000000
    >>> m[:10]
    b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
    >>> m[0]
    0
    >>> m[0:11]=b'Hello World'#改变一个切片
    >>> m.close()
    >>> with open('data','rb') as f:#验证改变已经生效
    	print(f.read(11))
    
    	
    b'Hello World'
    

    由于mmap()返回的mmap对象也可以当作上下文管理器使用,在这种情况下,底层的文件会自动关闭。

    >>> with memory_map('data') as m:
    	print(len(m))
    	print(m[0:11])
    
    	
    1000000
    b'Hello World'
    

    默认情况下memory_map()函数打开的文件既可以读,也可以写。对数据的任何修改都会拷贝回原始的文件中。

    如果需要只读访问,可以为access参数提供mmap.ACCESS_READ值。

    m = memory_map(filename, mmap.ACCESS_READ)
    

    如果只想要在本地修改数据,并不想将这些修改写回到原始文件中,可以使用mmap.ACCESS_COPY参数。

    m = memory_map(filename, mmap.ACCESS_COPY)
    

    总结:

    通过mmap将文件映射到内存之后,我们可以高效并优雅地对文件的内容进行随机访问。

    与其打开文件后通过组合各种seek()、read()和write()调用来访问,不如简单将文件映射到内存,然后通过切片操作来访问数据。

    需要强调的是,对某个文件进行内存映射并不会导致将整个文件读到内存中。也就是说,文件并不会拷贝到某种内存缓冲区或数组上。相反,操作系统只是为文件内容保留一段虚拟内存而已。

    当访问文件的不同区域时,文件的这些区域将被读取并按照需要映射到内存区域中。但是,文件中从未访问过的部分会简单地留在磁盘上。这一切都是以透明的方式在幕后完成的。

    如果有多个Python解释器对同一个文件做了内存映射,得到的mmap对象可以用来在解释器之间交换数据。也就是说,所有的解释器可以同时读/写数据,在一个解释器中对数据做出的修改会自动反映到其他解释器上。

    虽然还需要一些额外的步骤来处理同步问题,但是有时候可以使用这种方法作为通过管道或者socket传输数据的替代方案。

    更多技术干活,有趣摘录,点这里没错

    展开全文
  • vb 二进制 文件Recently I needed to inspect a bunch of Visual Basic 6 DLLs (binary) that I [gulp] didn't have the source for. I wanted to see if they were marked in Project Properties when they were ...
    vb 二进制 文件

    vb 二进制 文件

    Recently I needed to inspect a bunch of Visual Basic 6 DLLs (binary) that I [gulp] didn't have the source for. I wanted to see if they were marked in Project Properties when they were compiled as "Retain in Memory" and "Unattended Execution" (Note KBs Q264957 and Q241896) At any rate, a friend pointed me at this COMPLETELY UNSUPPORTED TOOL that you can run from the command-line and it will tell you if your VB6 Binaries are marked appropriately for use in COM+.

    最近,我需要检查一堆我没有提供源代码的Visual Basic 6 DLL(二进制)。 我想看看它们在被编译为“保留在内存中”和“无人参与执行”时是否在项目属性中被标记(请注意知识库文章Q264957Q241896 ),无论如何,一位朋友向我指出了您可以运行的此完全不受支持的工具从命令行,它会告诉您是否正确标记了VB6 Binaries以便在COM +中使用。

    翻译自: https://www.hanselman.com/blog/checking-vb6-binaries-for-retain-in-memory-and-unattended-execution

    vb 二进制 文件

    展开全文
  • plyloader.js有问题,...需要最后的时候加一行代码: header.headerLength = data.byteLength - header.elements[0].count * 12 - header.elements[1].count * 13; 原three.js中的代码: // var geometry;

    plyloader.js有问题,好像是算错了。项目组的成员解决了:
    需要在最后的时候加一行代码:
    header.headerLength = data.byteLength - header.elements[0].count * 12 - header.elements[1].count * 13;

    原在three.js中的代码:

    //
    
            var geometry;
            var scope = this;
    
            if ( data instanceof ArrayBuffer ) {
    
                var text = bin2str( data );
                var header = parseHeader( text );
    
                geometry = header.format === 'ascii' ? parseASCII( text, header ) : parseBinary( data, header );
    
            } else {
    
                geometry = parseASCII( data, parseHeader( data ) );
    
            }
    
            return geometry;

    改变后:

    var geometry;
            var scope = this;
    
            if ( data instanceof ArrayBuffer ) {
    
                var text = bin2str( data );
                var header = parseHeader( text );
                header.headerLength = data.byteLength - header.elements[0].count * 12 - header.elements[1].count * 13;
                geometry = header.format === 'ascii' ? parseASCII( text, header ) : parseBinary( data, header );
    
            } else {
    
                geometry = parseASCII( data, parseHeader( data ) );
    
            }
    
            return geometry;

    这样就可以,我现在还不懂怎么算的,准备先理解一下,再去问他

    展开全文
  • 二进制文件

    2015-05-22 21:02:52
    本质上是文本文件是把文件信息先转化成以字符编码的ascii码,再存储ascii的二进制代码。而二进制文件是直接把文件信息编码成二进制...稍微了解C程序设计的人都知道,文本文件和二进制文件在计算机上面都是以0,1存储的,
    本质上是文本文件是把文件信息先转化成以字符编码的ascii码,再存储ascii的二进制代码。而二进制文件是直接把文件信息编码成二进制存储。因此在读取的时候要考虑内存中二进制代码应该怎么样解释。
    二进制文件的读取是是要告诉元素的类型(编码方式),文本文件则默认为char类型。
    文本文件是一种特殊的二进制文件

    稍微了解C程序设计的人都知道,文本文件和二进制文件在计算机上面都是以0,1存储的,那么两者怎么还存在差别呢?对于编程人员来说,文本文件和二进制文件就是一个声明,指明了你应该以什么方式(文本方式/二进制)打开这个文件,用什么函数读写这个文件(读写函数),怎么判断读到这个文件结尾等。

    具体分析如下:

    一、以哪种方式打开一个文件

    ANSI C规定了标准输入输出函数库,用 fopen()函数打开文件。fopen()函数的调用方式一般为:
    FILE *fp;
    fp=fopen(文件名,使用文件方式);
    使用文件方式见下表:

    使用文件方式 含义
    "r"(只读) 为输入打开一个文本文件
    "w"(只写) 为输出打开一个文本文件
    "a"(追加) 为追加打开一个文本文件
    "rb"(只读) 为输入打开一个二进制文件
    "wb"(只写) 为输出打开一个二进制文件
    "ab"(追加) 为追加打开一个二进制文件
    "r+"(读写) 为读/写打开一个文本文件
    "w+"(读写) 为读/写创建一个文本文件
    "a+"(读写) 为读/写打开一个文本文件
    "rb+"(读写) 为读/写打开一个二进制文件
    "wb+"(读写) 为读/写创建一个二进制文件
    "ab+"(读写) 为读/写打开一个二进制文件


    同一个文件从磁盘读取文件到内存(程序数据区或者缓存区)时,两种方式下,内存中的内容一般不相同,这就是两种打开方式的实质性差别。

    1.在windows系统中,文本中,"\r\n"代表换行,程序中"\n"代表换行。若以文本模式打开文件,并用fputs等函数写入换行符"\n"时,函数会自动在"\n"前面加上"\r"。即实际写入文件的是"\r\n" 。 

    2.在类Unix/Linux系统中文本模式下,文件以"\n"代表换行。所以Linux系统中在文本模式和二进制模式下并无区别。
    这里要说一个背景,那就是在windows下,它会做一个处理,就是写文件时,换行符会被转换成回车,换行符存在磁盘文件上,而读磁盘上的文件时,它又会进行逆处理,就是把文件中连续的回车,换行符转换成换行符。
    因此,在读取一个磁盘文件时,文本方式读取到文件内容很有可能会比二进制文件短,因为文本方式读取要把回车,换行两个字符变成一个字符,相当于截短了文件。但是为什么仅仅是可能呢?因为可能文本中不存在连着的45,42这两个字节(45是CR回车的ASCII码,42是换行符CL的ASCII码),也就不存在“截短”操作了,因此读到的内容是一样的。
    具体的来说,文件文件(以文本方式写的),最好以文本方式读。二进制文件(以二进制方式写的),最好以二进制方式读。不然可能会不正确。

    二、以什么函数读写文件

    数据怎么在磁盘上写不是由文件打开方式决定的,而是由写函数决定的。数据怎么从磁盘上读也不是由文件打开方式决定的,而是由读函数决定的。
    上面说的数据怎么写是指,一种类型的变量是怎么存的?比如int 12,可以直接存12的二进制码(4个字节),也可以存字符1,字符2.
    数据怎么读的是指,我要读一个int变量,是直接读sizeof(int)个字节,还是一个字符一个字符的读,直到读到的字符不是数字字符。

    C里面有两组文件读写函数恰好支持上面两种方式的读写:

    1.fread(buffer,size,count,fp),fwrite(buffer,size,count,fp)。用来读写一个数据块。它对应的是第一种存储方式。直接按类型的字节长度指定读写的字节数。

    2.fprintf函数和fscanf函数.它对应的是第二种读写方式。即以字符的方式读写。(fprintf函数、fscanf函数与printf函数、scanf函数的作用相仿,都是格式化读写函数。fprintf和fscanf函数的读写对象是磁盘文件,而printf和scanf函数的读写对象是终端。)
    它们的一般调用格式为:

    fprintf (文件指针,格式字符串,输出列表);               
    fscanf (文件指针,格式字符串,输入列表);

    三、怎么判断文件尾

    在C语言,或更精确地说成 C标准函式库中,有一个特别的字符EOF(stdio.h中这个定义 #define EOF (-1) ),它表示:文件结束符(end of file)。在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件。在文本文件中,数据都是以字符的ASCII代码值的形式存放。我们知道,ASCII代码值的范围是0~255,不可能出现-1,因此可以用EOF作为文件结束标志。

    但是,C语言中,当把数据以二进制形式存放到文件中时,就会有-1值的出现,此时不能采用EOF作为二进制文件的结束标志。为解决这个问题,ANSI C提供一个feof函数,用来判断文件是否结束。如果遇到文件结束,函数feof(fp)的值为1,否则为0.
    feof函数既可用以判断二进制文件是否结束,也可以用以判断文本文件是否结束。但是要注意feof用以判断文本文件尾时,如果代码编写不当,可能会把文本文中中的文件结束符EOF也读取出来了;具体可以参考http://baike.baidu.com/view/656648.htm中feof函数的用法。

    四、知道一个文件是文本文件,还是二进制文件,更多的“提醒”我们,应该选择哪种读写函数。

    正如前文所说的,数据怎么存不是由文件打开方式决定的,而是由读写函数决定的。
    比如说,我们以二进制文件的方式打开一个文件(实际上只是指明了要进行换行符的转换),它更多的是代表一种理念(虚的):我“希望”这个文件里面的数据是这样的,int类型占4字节,char占1个字节。这种模式下,我用fread(buffer,size0f(int),1,fp)读取一个int到int变量中。

    这里需要记住:

    我们在对一个文件进行操作以前,首先,我们要清楚这个文件到底是文本文件还是二进制文件。文件文件用文本方式打开,二进制文件用二进制方式打开
    如果我们要操作一个二进制文件,那么我们就以二进制方式打开(理论上也可以以文件方式打开,但是如果写的二进制数据里面有45时,会转化成45,42存储,如前文所述。这是很有可能发生的)。同时读写的时候用fread,fwrite这两个函数。
    如果我要操作一个文本文件,那么我们就以文本的方式打开(理论上也可以以二进制方式打开,但是不保险)。同时读写的时候用读写字符的那些函数fprintf,fscanf ,fgetc,fputc,putw,getw,fgetc,fputs.

    展开全文
  • 查看 stdio.h 可以看到如下定义: #define EOF (-1) #define _IOEOF 0x0010 #define feof(_stream) ((_stream)->...这里先说下EOF和feof()这个两个宏定义,我们学的课本中有这样的描述...
  • 参考:https://blog.csdn.net/Machey__/article/details/78535956C++一次将整个文件采用二进制方式读入内存,解决部分文本文件末尾乱码问题。注意:此方式只能读取文本类的文件,我试过读取winrar,.exe文件都不行。...
  • 计算机物理内存上面存放的都是二进制数据,所以文本文件和二进制文件的 主要区别是逻辑上的而不是物理上的。从文件的编码方式来看,文件可以分为文本文件和二进制文件。 文本文件是基于 字符编码 的文件,常见的...
  • 计算机在物理内存上面存放的都是二进制,所以文本文件和二进制文件的主要区别是在逻辑上的而不是物理上的。而从文件的编码方式来看,...二进制文件:就是把内存中的数据按其在内存中存储的形式原样输出到磁盘中存放...
  • 文本文件和二进制文件在存储时的区别

    万次阅读 多人点赞 2012-07-26 15:42:17
    1、二进制文件是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放,也就是说存放的是数据的原形式。 2、文本文件是把数据的终端形式的二进制数据输出到磁盘上存放,也就是说存放的是数据的终端形式。 ...
  • 定义: 二进制文件就是把内存中的数据按其在内存中存储的形式原样输出到磁盘中存放,即存放的是数据的原形式。 读取流程: 用记事本打开二进制文件的流程是怎样的呢?记事本无论打开什么文件都按既定的字符编码...
  • 1、C语言中缺省是按照文本方式打开文件。...(3)二进制文件是包含 ASCII 及扩展 ASCII 字符中编写的数据或程序指令的文件。一般是可执行程序、图形、图象、声音等等文件。 (4)文本文件(也称为ASCII文件):它
  • 二进制文件与文本文件的区别

    千次阅读 2017-05-03 16:27:48
    计算机物理内存上面存放的都是二进制,所以文本文件和二进制文件的主要区别是逻辑上的而不是物理上的。而从文件的编码方式来看,文件可以分为文本文件和二进制文件。文本文件是基于字符编码的文件,常见的有...
  • C++二进制文件读写

    2018-04-10 15:06:32
    二进制文件不是以ASCII代码存放数据的,它将内存中数据存储形式不加转换地传送到磁盘文件,因此它又称为内存数据的映像文件。因为文件中的信息不是字符数据,而是字节中的二进制形式的信息,因此它又称为字节文件。...
  • 读写二进制文件

    2013-04-14 19:55:47
    fopen , fread fwrite 函数读写...使用 fread 读二进制文件(png 图片)的时候, 发现读取到内存中的数据和 二进制文件中的数据不一致, 同样, 使用 fwrite 写二进制文件(png 图片)的时候, 发现写入到内存
  • Binary Viewer是二进制的Windows实用工具允许你打开任何文件位置(您的计算机上任何格式文件)。它能显示数据以十进制,八进制,十六进制和文本...二进制友好用户界面,支持大型文件(4 GB),又有一个小的内存
  • 二进制文件不是以 ASCII 代码存放数据的,它将内存中数据存储形式不加转换地传送到 磁盘文件,因此它又称为内存数据的映像文件。因为文件中的信息不是字符数据,而是字节 中的二进制形式的信息,因此它又称为字节...
  • 二进制文件不是以ASCII代码存放数据的,它将内存中数据存储形式不加转换地传送到磁盘文件,因此它又称为内存数据的映像文件。因为文件中的信息不是字符数据,而是字节中的二进制形式的信息,因此它又称为字节文件。 ...
  • C++操作二进制文件

    2016-02-20 21:15:47
    二进制文件不是以ASCII代码存放数据的,它将内存中数据存储形式不加转换地传送到磁盘文件,因此它又称为内存数据的映像文件。因为文件中的信息不是字符数据,而是字节中的二进制形式的信息,因此它又称为字节文件。 ...
  • 本文主要针对结构体内存对齐,python Struct,以及二进制文件解析做总结。 一、结构体内存对齐 1、为什么要内存对齐 (1)平台移植性好 不是所有硬件平台都能访问任意地址上的数据,某些硬件平台只能某些地址...
  • matlab 环境下二进制文件操作

    千次阅读 2017-11-09 23:28:25
    matlab 环境下二进制文件的操作二进制文件与文本文件概述在物理层面上,文件都是以二进制的方式存储在内存中的。所谓二进制文件和文本文件其区别是在逻辑层面上的。文本文件是基于字符编码的,而二进制文件是基于...
  • 数据库文件、图像文件、可执行文件、动态链接库文件、音频文件、视频文件、Office文档等均属于二进制文件。对于二进制文件,不能使用记事本或其他文本编辑软件直接进行正常读写,也不能通过Python的文件对象直接读取...
  • c++ 读写 二进制文件

    2013-11-11 15:06:45
    二进制文件不是以ASCII代码存放数据的,它将内存中数据存储形式不加转换地传送到磁盘文件,因此它又称为内存数据的映像文件。因为文件中的信息不是字符数据,而是字节中的二进制形式的信息,因此它又称为字节文件。 ...
  • 1 视图形式 不同的二进制文件需要不同的软件来打开,例如BMP文件,需要一个读图的软件来打开才能看到里面保存...二进制文件的读写速度非常快,因为它就是将数据在内存中的存储形式(二进制)原模原样放到文件中,读出.
  • ASCII码文件与二进制文件的区别

    千次阅读 2019-05-09 21:07:10
    二进制文件是按该数据类型在内存中的存储形式存储的; 文本文件则是将该数据类型转换为可在屏幕上显示的形式存储的; 2)存储空间 ASCII存储方式所占空间较多且所占空间大小与数值大小有关; 3)读写时间 ...
  • 内存映射一个文件并不会导致整个文件被读取到内存中。 也就是说,文件并没有被复制到内存缓存或数组中。相反,操作系统仅仅为文件内容保留了一段虚拟内存。 当你访问文件的不同区域时,这些区域的内容才根据需要被...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,505
精华内容 2,202
关键字:

二进制文件在内存