精华内容
下载资源
问答
  • 二进制文件在内存
    2021-05-28 05:29:08

    目标:

    用二进制数据打开文件,将整个文件读入内存,更改文件的某些部分,将内存缓冲区写入文件,关闭文件.利润?

    问题:

    我刚刚开始学习C,我找不到有关如何更改内存缓冲区中的二进制数据的足够信息.来自Web开发人员背景(php,python,as3)这对我来说是一个新的领域.

    上下文:

    我有一个函数,它获取文件的路径和指针地址到char指针内存缓冲区.然后打开文件,遍历文件并将数据写入内存缓冲区.最后关闭文件.

    二进制文件的目的是为某些对象保存category-id,它们的位置是它们自己的id. category-id表示为2字节短路.所以基本上它只是一个二进制文件,里面装满了很多我希望能够阅读和更改的短裤.

    这是我到目前为止所得到的:

    main.c中:

    #include "binary-handler.h"

    void showFileBuffer(char *buffer, unsigned int fileSize){

    int i = 0;

    for(; i < fileSize; ++i){

    printf("\n", i, ((char *)buffer)[i]);

    }

    }

    int main(){

    char path[] = "assets/map-squares.bin";

    char *buffer;

    int fileSize;

    fileSize = readFileToMemory(path, &buffer);

    showFileBuffer(buffer, fileSize);

    //Code to change buffer

    //Code to write buffer to file

    return 0;

    }

    二进制handler.c:

    #include

    #include

    unsigned int getFileSize(FILE **file){

    unsigned int size;

    if(fseek(*file, 0, SEEK_END) == -1){ return -1; }

    size = ftell(*file);

    fseek(*file, 0, SEEK_SET);

    return size;

    }

    char *getFileBuffer(FILE **file, unsigned int fileSize){

    char *buffer = malloc(fileSize + 1);

    fread(buffer, fileSize, 1, *file);

    return buffer;

    }

    unsigned int readFileToMemory(char path[], char **buffer){

    unsigned int fileSize;

    FILE *file = fopen(path, "rb");

    if(file != NULL){

    fileSize = getFileSize(&file);

    *buffer = getFileBuffer(&file, fileSize);

    fclose(file);

    return fileSize;

    }else{

    *buffer = NULL;

    return -1;

    }

    }

    1.此代码是否会正确生成第一步(读取文件到内存)?

    2.如果是,我如何更改,说缓冲区中的第二个对象的值为0F 00?

    3.如何获取缓冲区并将其写回文件?

    4.有没有办法让我以冗长的方式检查缓冲区中的值?

    总而言之,我只想帮助掌握整个概念,以便我自己解决这个问题.

    谢谢!

    编辑:删除了文件的循环.添加了打印整个缓冲区的功能.

    更多相关内容
  • main2.cpp 生成1个二进制文件。 main3.c 读取二进制文件。 用fgets可以读取指定长度的字符串。 可用于读取格式化固定位址的二进制结构数据。
  • 用c语言将二进制执行文件读到缓冲区当中,并打印出PE结构信息
  • 二进制文件不是以ASCII代码存放数据的,它将内存中数据存储形式不加转换地传送到磁盘文件,因此它又称为内存数据的映像文件。因为文件中的信息不是字符数据,而是字节中的二进制形式的信息,因此它又称为字节文件。 ...
  • 在内存中直接运行二进制文件,不用先下载到磁盘
  • 将结构体数据写入二进制文件,从二进制文件中读取结构体数据
  • 二进制文件不是以ASCII代码存放数据的,它将内存中数据存储形式不加转换地传送到磁盘文件,因此它又称为内存数据的映像文件。因为文件中的信息不是字符数据,而是字节中的二进制形式的信息,因此它又称为字节文件。 ...
  • 使用标准 fopen 和 fread MALTAB 中解析二进制文件可能很耗时。 每个 fread 调用都需要一个磁盘读取操作。 mfile 类通过一次性将二进制文件读入内存来消除多次读取操作的需要。 fread 命令使用 mfile 扫描保存...
  • 自动修饰工具 这是bento-autobentifier 的发源地,它是一种用于将现有二进制文件自动分区到bento-box 中的工具,同时最大限度地减少box 切换的开销。 更多详情、使用方法,请下载后阅读README.md文件
  • 最近看到个奇怪的需求:c++如何读入二进制文件,然后输出,意思是二进制读取,不进行任何转化,输出二进制。 从理论上讲,所有数据都是二进制的,但是很少人会将其展现出来,因为看不懂。但并不意味着这种操作毫无...

    C++有各种奇怪的骚操作,今天说说其中一种。

    最近看到个奇怪的需求:c++如何读入二进制文件,然后输出,意思是二进制读取,不进行任何转化,输出二进制。

    从理论上讲,所有数据都是二进制的,但是很少人会将其展现出来,因为看不懂。但并不意味着这种操作毫无道理。

    我们说的字符,数字,说到底不过是0101的组合,只是在于解释系统的不同,产生了不同分类。

    刚学编程那会,看见有人用char代替int进行数据的计算和存储,觉得好奇怪,后来才明白,不过是0-255的数字,用int是8字节,废空间。

    说回来,所有都是二进制,而二进制本身,作为最根本的数据类型,却不是最基础的类型。仔细想象,二进制类还真的满特殊的。

    但不要紧,C++作为全宇宙最复杂的编程语言,还真的提供了一种近似类型,bitset,比特集合,翻译的很到位。

    由于平常极少使用这种类型,它就处在知识库的犄角旮旯,这不,偶尔还真能派上用场。

    常规解法

    如果没有 bitset 这种类型,常规思路大概如下:

    1. 将二进制文件读到字符数组 char[ ]

    2. 对每个 char 进行位运算,将8位类似 0 0 1 1 0 1 0 1 的二进制与一个 int 1 进行 & 运算,输出结果,右移一位,继续循环。

    我能想到的大概就是这种思路,当然,还可能将 4 个 char 通过位运算搞成1个unsigned int,用 cout 方法输出,但比较遗憾,cout 没有二进制输出 int 的选项,C语言的 stdio 也没有这种操作。

    bitset 骚操作

    既然 C++ 标准库提供了这样一种类二进制类,我们就拿来用用。

    声明一点,我没有深入探究 bitset 类的实现方法,所以不能保证代码的安全性,只能说结果满足,如果要用此法进行重要程序操作,要小心。

    思路:

    将二进制数据读入char数组,由于所有数据都是二进制,所以char[ ] 与 bitset 只是解读形式的不同,既然如此,那么我就创造一个与字符数组一样大小的 bitset 类,并直接将字符数组的整块内存直接拷贝到 bitset 对象地址中,以这种暴力的方式进行构造。

    所得到的 bitset 对象,就是解读为 0101 的形式,并可以用 cout 直接输出,毕竟这是标准库类,有完备的配套方法。

    代码:环境是windows + clang64,不保证其他平台的编译实现可运行。

    #include <bitset>
    #include <fstream>
    #include <iostream>
    
    auto main() -> int
    {
        std::ifstream fin("stu2.txt", std::ios::binary);
        char szBuf[4] = {0};
        while (fin.read(szBuf, sizeof(szBuf) - 1))
        {
            std::cout << "str = " << szBuf << std::endl;
            const int k = sizeof(szBuf) * 8;
            std::bitset<k> temp;
            memcpy(&temp, szBuf, strlen(szBuf));
            std::cout << temp << std::endl;
            memset(szBuf, 0, sizeof(szBuf));
        }
        if (fin.eof())
        {
            std::cout << "str = " << szBuf << std::endl;
            const int k = sizeof(szBuf) * 8;
            std::bitset<k> temp;
            memcpy(&temp, szBuf, strlen(szBuf));
            std::cout << temp << std::endl;
            memset(szBuf, 0, sizeof(szBuf));
        }
        return 0;
    }
    
    展开全文
  • 免安装,可打开磁盘,内存等等,支持数据编辑,写入等等
  • 010 编辑器:专业文本编辑器 ... 无限制的撤消和强大的编辑和脚本工具。 巨大的文件支持 (50 GB+)。...功能强大,足以解析几乎任何二进制文件格式。 可以设置为打开文件时自动运行。 模板可以共享,模板列表可
  • 首先导入所需的包:import struct struct有以下几个主要的函数: ...例如:我需要读取一个名为filename,存放着形状为[100,1025]的浮点数的文件。可以采用以下办法 import numpy as np import struct # 加载测试数据
  • 010 Editor 是一款很好用的编辑器,其中有一个很好的特点是可以运行模板文件来分析二进制文件。查看和编辑硬盘驱动器上的任何二进制文件(文件大小无限制)和文本文件,包括Unicode文件,C / C ++,XML,PHP等。 ...
  • 一些用于在内存中破解 mach 二进制文件的文件。 这还没有经过彻底的测试。 使用风险自负。 什么似乎有效: 模拟器上将 Monkey-patching 类和字符串符号导入 iOS 7 iOS 8 设备上混淆类引用 什么似乎不起作用...
  • C语言入门教程-二进制文件

    千次阅读 2021-05-20 16:01:42
    二进制文件二进制文件非常类似于结构体数组,只不过这些结构体被保存一个磁盘文件而非内存数组中。因为是使用磁盘保存二进制文件中的结构体,所以您可以创建非常庞大数目的结构体(只受可用磁盘空间的限制)。它们...

    二进制文件

    二进制文件非常类似于结构体数组,只不过这些结构体被保存在一个磁盘文件而非内存数组中。因为是使用磁盘保存二进制文件中的结构体,所以您可以创建非常庞大数目的结构体(只受可用磁盘空间的限制)。它们还是永久性的,并且可以随时使用。惟一的缺点是磁盘存取会造成延迟。

    二进制文件与文本文件有两个不同的特点:您可以立即跳至文件中的任一结构体,类似于数组的随机存取。 您可以随时改变文件中任一处结构体的内容。

    二进制文件通常还具有比文本文件更短的存取时间,因为文件记录的二进制映像是直接从内存传送至磁盘的(或相反的方向)。对于文本文件,所有数据都要反复转换成文本,而这需要花费时间。

    C所支持的“结构体文件”概念十分简洁。某文件被打开后,您可以读取一个结构体,写入一个结构体,或移动至文件中的任一结构体。这种文件模型要求有一个文件指针的概念。打开文件时,指针指向0号记录(文件的第一个记录)。任何读操作都读取当前被指向的结构体,并将指针指向下一个结构体。任何写操作都向当前被指向的结构体写入数据,并将指针指向下一个结构体。移动操作将文件指针移至指定的记录。

    请记住C总是将文件内容视为从磁盘读入内存或从内存写入磁盘的字节块。C使用文件指针,但指针可以指向文件中的任一字节。因此您需要自己管理好指针的位置。

    下面的程序可以说明以上概念:

    #include /* 任取一种文件记录结构,也可以是其他形式 */

    struct rec

    {

    int x,y,z;

    };

    /* 向文件“junk”先写入

    再读取10条随意的记录。*/

    int main()

    {

    int i,j;

    FILE *f;

    struct rec r;

    /* 创建一个包含10条记录的文件 */

    f=fopen("junk","w");

    if (!f)

    return 1;

    for (i=1;i<=10; i++)

    {

    r.x=i;

    fwrite(&r,sizeof(struct rec),1,f);

    }

    fclose(f);

    /* 读取这10条记录 */

    f=fopen("junk","r");

    if (!f)

    return 1;

    for (i=1;i<=10; i++)

    {

    fread(&r,sizeof(struct rec),1,f);

    printf("%dn

    ",r.x);

    }

    fclose(f);

    printf("n

    ");

    /* 使用fseek逆序读取10条记录 */

    f=fopen("junk","r");

    if (!f)

    return 1;

    for (i=9; i>=0; i--)

    {

    fseek(f,sizeof(struct rec)*i,SEEK_SET);

    fread(&r,sizeof(struct rec),1,f);

    printf("%dn

    ",r.x);

    }

    fclose(f);

    printf("n

    ");

    /* 使用fseek隔条读取记录 */

    f=fopen("junk","r");

    if (!f)

    return 1;

    fseek(f,0,SEEK_SET);

    for (i=0;i<5; i++)

    {

    fread(&r,sizeof(struct rec),1,f);

    printf("%dn

    ",r.x);

    fseek(f,sizeof(struct rec),SEEK_CUR);

    }

    fclose(f);

    printf("n

    ");

    /* 使用fseek读取第4条记录,

    修改记录内容并写回 */

    f=fopen("junk","r+");

    if (!f)

    return 1;

    fseek(f,sizeof(struct rec)*3,SEEK_SET);

    fread(&r,sizeof(struct rec),1,f);

    r.x=100;

    fseek(f,sizeof(struct rec)*3,SEEK_SET);

    fwrite(&r,sizeof(struct rec),1,f);

    fclose(f);

    printf("n

    ");

    /* 读取10条记录

    检查第4条记录是否已被修改 */

    f=fopen("junk","r");

    if (!f)

    return 1;

    for (i=1;i<=10; i++)

    {

    fread(&r,sizeof(struct rec),1,f);

    printf("%dn

    ",r.x);

    }

    fclose(f);

    return 0;

    }

    此程序使用了一个名为rec的结构体类型,但您也可以使用任一种结构体类型。您可以看到fopen和fclose的使用和在文本文件中是一样的。

    新引入的函数是fread、fwrite和fseek。fread函数接受四个参数:一个内存地址 读入的内存块包含的字节数 读入的内存块个数 文件变量

    因此,fread(&r,sizeof(struct rec),1,f);表示:把12个字节(rec类型的大小)的内容从文件f(文件指针指向的当前位置)读入内存地址&r,共要求读入一个12字节大小的块。只要把1改成100,就可以很容易地使这条语句变为:将100个块从磁盘读入一个内存数组中。

    fwrite和fread类似,只不过它是将字节块从内存写入文件中。fseek函数负责把文件指针移至文件中的某个字节。指针每次移动的距离一般都是sizeof(struct rec)的整数倍,这样指针就可以保持总是指向记录的开始处。移动指针有三种方式:SEEK_SET SEEK_CUR SEEK_END

    SEEK_SET表示指针从文件开始处(0字节处)向后移动x个字节。SEEK_CUR表示指针从当前位置向后移动x个字节。SEEK_END表示指针从文件末尾向前移动(所以偏移量应为负数)。

    上面代码中使用了多个函数选项。其中请特别注意一下用r+模式打开文件的段落。这种模式支持文件的读取和写入,即可以修改文件中的记录。程序首先把文件指针移至某个记录,然后读取这条记录内容并修改了一个成员。之后重新把指针移动指向此记录,因为刚才的读取已经更新了指针。最后把修改过的记录写回。

    展开全文
  • 文本文件和二进制文件的区别

    千次阅读 2020-12-18 12:53:05
    定义广义的二进制文件即指文件,由文件外部设备的存放形式为二进制而得名。狭义的二进制文件即除文本文件以外的文件。文本文件是一种由很多行字符构成的计算机文件。文本文件存在于计算机系统中,通常文本文件...

    定义

    广义的二进制文件即指文件,由文件在外部设备的存放形式为二进制而得名。狭义的二进制文件即除文本文件以外的文件。文本文件是一种由很多行字符构成的计算机文件。文本文件存在于计算机系统中,通常在文本文件最后一行放置文件结束标志。文本文件的编码基于字符定长,译码相对要容易一些;二进制文件编码是变长的,灵活利用率要高,而译码要难一些,不同的二进制文件译码方式是不同的。

    从本质上来说他们之间没有什么区别,因为他们在硬盘上都有一种的存放方式--二进制,但是如果要对他们有些区分的话,那可以这样理解。每个字符由一个或多个字节组成,每个字节都是用的-128—127之间的部分数值来表示的,也就是说,-128——127之间还有一些数据没有对应任何字符的任何字节。如果一个文件中的每个字节的内容都是可以表示成字符的数据,我们就可以称这个文件为文本文件,可见,文本文件只是二进制文件中的一种特例,为了与文本文件相区别,人们又把除了文本文件以外的文件称为二进制文件,由于很难严格区分文本文件和二进制文件的概念,所以我们可以简单地认为,如果一个文件专门用于存储文本字符的数据,没有包含字符以外的其他数据,我们就称之为文本文件,除此之外的文件就是二进制文件。

    使用二进制文件的好处

    为什么要使用二进制文件。原因大概有三个:

    第一是二进制文件比较节约空间,这两者储存字符型数据时并没有差别。但是在储存数字,特别是实型数字时,二进制更节省空间,比如储存 Real*4 的数据:3.1415927,文本文件需要 9 个字节,分别储存:3 . 1 4 1 5 9 2 7 这 9 个 ASCII 值,而二进制文件只需要 4 个字节(DB 0F 49 40)

    第二个原因是,内存中参加计算的数据都是用二进制无格式储存起来的,因此,使用二进制储存到文件就更快捷。如果储存为文本文件,则需要一个转换的过程。在数据量很大的时候,两者就会有明显的速度差别了。

    第三,就是一些比较精确的数据,使用二进制储存不会造成有效位的丢失。[1]

    二进制文件的储存方式

    列举一个二进制文件如下:

    00000000h:0F 01 00 00 0F 03 00 00 12 53 21 45 58 62 35 34; .........S!EXb54

    00000010h:41 42 43 44 45 46 47 48 49 47 4B 4C 4D 4E 4F 50; ABCDEFGHIGKLMNOP

    这里列出的是在 UltraEdit(UE) 里看到的东西。其实只有红色部分是文件内容。前面的是 UE 加入的行号。后面的是 UE 尝试解释为字符型的参考。

    这个文件一共有 32 字节长。显示为两列,每列 16 个字节。实际上,这仅仅是 UE 的显示而已。真实的文件并不分行。仅仅知道这个文件的内容,如果我们没有任何说明的话,是不能看出任何有用信息的。

    下面我规定一下说明:我们认为,前 4 个字节是一个 4 字节的整型数据(0F 01 00 00 十六进制:10Fh 十进制:271)。这 4 个字节之后的 4 个字节是另一个 4 字节的整型数据(0F 03 00 00 十六进制:30Fh 十进制:783)。其后的 4 个字节(12 53 21 45 )表示一个 4 字节的实型数据:2.5811919E+3。再其后的 4 个字节(58 62 35 34)表示另一个 4 字节的实行数据:1.6892716E-7。而只后的 16 个字节(41 42 43 44 45 46 47 48 49 47 4B 4C 4D 4E 4F 50)我们认为是 16 个字节的字符串(ABCDEFGHIGKLMNOP)

    实际上,二进制文件只是储存数据,并不写明数据类型,比如上面的第 9 字节到第 16 字节(12 53 21 45 58 62 35 34),我们刚才认为是 2 个 4 字节的实型,其实也可以认为是 8 个字节的字符型( S!EXb54)。而后面的 16 个字节的字符串(ABCDEFGHIGKLMNOP),我们也可以认为是 2 个 8 字节的整型,或者 4 个 4 字节的整型,甚至 2 个 8 字节的实型,4 个 4 字节的实型,等等等等。

    因此,面对一个二进制文件,我们不能准确地知道它的含义,我们需要他的数据储存方式的说明。这个说明告诉我们第几个字节到第几个字节是什么类型的数据,储存的数据是什么含义。否则的话,我们只能猜测,或者无能为力。[1]

    如何使用语句操作二进制文件

    我们将上面的那个二进制文件保存为:TestBin.Bin 来举例。

    读取和写入二进制其实是两个很类似的操作,了解了其中之一,另一个也就不难了。

    二进制文件我们通常使用直接读取方式,Open 语句可以写为:

    引用:

    Open( 12 , File = 'TestBin.Bin' , Access = 'Direct' , Form = 'Unformatted' , RecL = 4 )

    上面的 Access 表示直接读取方式,Form 表示无格式储存。比较重要的是 RecL 。我们读取数据时,是用记录来描述单位的,每一次读入或写入是一个记录。记录的长度在 Open 时就确定下来,以后不能改变。如果需要改变,只能 Close 以后再此 Open。

    记录长度在某些编译器下表示读取的 4 字节长度的倍数,规定为 4 表示记录长度为 16 字节。有些编译器下就直接表示记录的字节数,规定为 4 则表示记录长度为 4 字节。这个问题需要参考编译器手册。在 VF 系列里,这个值是前面一个含义。可以通过设置工程属性的 Fortran,Data,Use Bytes as RECL= Unit for Unformatted Files 来改变,使之成为后一个含义。在命令行模式下,则使用 /assume:byterecl 这个编译选项。

    确定 RecL 大小是我们需要做的事情,一般来说,不适合太大,也不适合太小。还需要结合数据储存方式来考虑。太小的话,我们需要执行读写的次数就多,太大的话,我们就不方便操作小范围的数据。

    有时候我们甚至会分多次来读取数据,每一次的 RecL 都不同。对于上面的 TestBin.Bin 文件来说,它比较简单,我以 16 字节长度和 8 字节长度两种读取方式来演示,你甚至可以一次 32 个字节长度全部读完。[1]

    用例

    C++程序语言学习过程中常见名词,相对于Binary file的是Text file(纯文本文件)。

    C++中二进制文件读写函数:

    fread

    fwrite

    ifstream.read()

    ofstream.write()

    文件读

    文件写

    等等……

    Java中二进制文件读写函数:

    FileInputStream()

    FileOutputStream()

    文件输入流()

    文件输出流()

    等等……

    那么,这个时候我们肯定会问:

    汉字怎样转化为二进制代码?

    各数制之间的转换

    我们用R表示任何数制的基数,讨论各数制之间的转换。

    1.R进制数转换为十进制数

    二进制、八进制和十六进制数转换为等值的十进制数,只要把它们用多项式表示并在十进制下进行计算,所得的结果就是十进制数。

    2.十进制数转换为R进制数

    十进制数转换为等值的二进制、八进制和十六进制数,需要对整数部分和小数部分分别进行转换。其整数部分用连续除以基数R取余数的方法来完成,小数部分用连续乘以基数R取整数的方法来实现。

    基数   基数   基数   基数   基数

    十进制  10000  1000   100   10    1

    二进制   16    8    4    2    1

    八进制  4096   512    64   8    1

    十六进制 65536  4096   256   16    1

    3.二进制数与八进制数、十六进制数的转换

    二进制数与八进制数的转换应以"3位二进制数对应1位八进制数"%的原则进行。同理,因为24=16,则二进制数与十六进制数的转换应以"4位二进制数对应1位十六进制数"的原则进行。

    四、二进制数的运算

    在计算机中,二进制数的运算包括算术运算和逻辑运算。

    1.二进制数的算术运算

    (1)二进制数加法

    加法原则:逢二进一

    (2)二进制数减法

    减法原则:借一当二

    (3)二进制数乘法

    乘法原则:与算术乘法形式相同

    (4)二进制数除法

    除法原则:与算术除法形式相同

    2.二进制数的逻辑运算

    逻辑运算是以二进制数为基础的,逻辑变量只有两个,用来表示逻辑"真"和"假"。

    (1)逻辑加法("或"运算)

    运算符号:"+"或"∨"

    运算规则:0+0=0;0+1=1;1+0=1;1+1=1;

    (2)逻辑乘法("与"运算)

    运算符号:"×"或"∧"

    运算规则:0×0=0;0×1=0;1×0=0;1×1=1;

    (3)逻辑"非"运算

    运算符号:"-"%运算规则:A&-*=0时,A=1

    五、数据类型及数据单位

    1.数据的两种类型

    计算机中的数据可概括分为两大类:数值型数据和字符型数据。所有的非数值型数据都要经过数字化后才能在计算机中存储和处理。

    2.数据单位

    在计算机中通常使用三个数据单位:位、字节和字。位的概念是:最小的存储单位,英文名称是bit,常用小写b或bit表示。用8位二进制数作为表示字符和数字的基本单元,

    英文名称是byte,称为一字节。通常用大"B"表示。

    1B(字节)=8b(位)

    1KB(千字节)=1024B(字节)

    1MB(兆字节)=1024KB(千字节)

    字长:字长也称为字或计算机字,它是计算机能并行处理的二进制数的位数。

    六、字符编码与汉字编码

    1.字符编码

    目前微型机中普遍采用的字符编码是ASCII码。它是用七位二进制数对127个字符进行编码,其中前32个是一些不可打印的控制符号。

    2.汉字编码及字模信息

    汉字有两种编码:国标码与机内码。

    国标码是"中华人民共和国国家标准信息交换汉字编码",代号为"GB2312-80"。在国标码的字符集中,收集了一级汉字3755个,二级汉字3008个,图形符号682个,共7445个。一个汉字对应一个区位码,由四位数字组成,前两位数字为区码(0~94),后两位数字为位码(0~94)。机内码是指汉字在计算机中的编码

    汉字的机内码占两个字节,分别称为机内码的高位与低位。它们与区位码的关系如下:

    机内码高位=区码+A0H

    机内码低位=位码+A0H

    汉字字库是由所有汉字的字模信息构成的。一个汉字字模信息占若干字节,究竟占多少个字节由汉字的字形决定。

    例如,如果用16×16点阵表示一个汉字,则一个汉字占16行,每行有16个点,在存储时用两个字节存放一行上16个点的信息,对应位为"0"表示该点为"白","1"表示该点为"黑"。因此,一个16×16点阵的汉字占32个字节。

    ---------------------------------------------------------------

    描述2进制的数据结构,用字符串直观,但是效率低,用数组效率高,但是不直观。

    但是道理相同。

    性字转换后的结果:

    010000010000 010010010000 010010010100 111011111110 110010010000 010100010000 010011111110 010000010000 010000010000 010000010000 010111111110 000000000000

    144位编码,这也不可能的,

    性字编码alert asc("性")得到-12076,转化为2进制为-10111100101100 不算正负有14位就够了。

    如果非要补到144位也因该是高位补0。

    function c10to2(x)

    '10进制到2进制的转换

    dim sign, result

    result = ""

    '符号

    sign = sgn(x)

    x = abs(x)

    if x = 0 then

    c10to2 = 0

    exit function

    end if

    do until x = "0"

    result = result & (x mod 2)

    x = x \ 2

    loop

    result = strReverse(result)

    if sign = -1 then

    c10to2 = "-" & result

    else

    c10to2 = result

    end if

    end function

    ---------------------------------------------------------------

    另外一个人的写法:

    function c10to2(x)

    mysign=sgn(x)

    x=abs(x)

    DigS=1

    do

    if x<2^DigS

    二进制编码转汉字:

    1. 汉字信息交换码(国标码)

    《信息交换用汉字 编码字符集·基本集》是我国于1980年制定的国家标准 GB2312-80,代号为国标码,是国家规定的用于汉字信息处理使用的代码依据。

    GB2312-80中规定了信息交换用的6763个汉字和682个非汉字图形符号(包括几种外文字母、数字和符号)的代码。

    6763个汉字又按其 使用频度、组词能力以及用途大小分成一级常用汉字3755个和二级常用汉字3008个。

    一级汉字按拼音字母顺序排列;若遇同音字,则 按起笔的笔形顺序排列;若起笔相同,则按第二笔的笔形顺序排列,依次类推。所谓笔形顺序,就是横、竖、撇、点和折的顺序。二级汉字按 部首顺序排列。

    在此标准中,每个汉字(图形符号)采用双字节表示。每个字节只用低7位,最高位恒为1。由于低7位中有34种状态是用 于控制字符,因此,只有94(128-34=94)种状态可用于汉字编码。这样,双字节的低7位只能表示94×94=8836种状态。

    编码范围

    十进制数码

    基本 ASCII 码

    00000000~01111111

    0~127

    控制字符

    00000000~00100000、01111111

    0~32、127

    可用汉字段

    00100001~01111110

    33~126 (1~94)

    扩充 ASCII 码

    10000000~11111111

    128~255

    控制字符

    10000000~10100000、11111111

    128~160、255

    GB2312-80

    10100001~11111110

    161~254 (1~94)

    此标准的汉字编码表有94行、94列,其行号称为区号,列号称为位号。双字节中,用 高字节表示区号,低字节表示位号。非汉字图形符号置于第1~11区,一级汉字3755个且于第16~55区,二级汉字3008个置于第56~87区。

    每个图形字符的汉字交换码,均用两个字节的低7位二进制码表示。汉字国标码通常用十六进制数表示。

    例如:“中”字的区号为 54,位号为48,计算它的二进制数和十六进制数国标码。

    解:先将区、位号分别加上 32 :

    54+32=86

    48+32=80

    分别转换为二进制数:

    (86)10=01010110

    (80)10=0 1010000

    得到二进制数国标码为:

    01010110 01010000。

    最后通过 8 4 2 1 ── 二进制取位法转换成十六 进制汉字国标码为:5650。

    又如“国”字的区号为25,位号为90,用以上相同的方法得到它的国标码为:

    二进制:00111001 01111010

    十六进制:397A

    ----------------------------------------------------------------

    基于以上原则,则

    11000100,11100011,10111010,11000011

    >(1100 0100 1110 0011)2,(1011 1010 1100 0011)2

    >(C4E3)16,(BAC3)16

    >查表可知:C4E3>>‘你’,BAC3>>‘好’

    展开全文
  • 二进制文件中的数据读出,并写入到一个txt文件中去 (read the data a binary file, and write the data into a txt file)
  • Linux下查看二进制文件命令

    千次阅读 2021-05-09 03:13:34
    一、Linux下查看二进制文件的软件:xxdhexdump二、编辑:1、biew2、hexedit3、vimVim 来编辑二进制文件。Vim 本非为此而设计的,因而有若干局限。但你能读取一个文件,改动一个字符,然后把它存盘。结果是你的文件...
  • Java读取二进制文件,读取文件的前64和文件末尾64个字节。
  • 1 视图形式 不同的二进制文件需要不同的软件来打开,例如BMP文件,需要一个读图的软件来打开才能看到里面保存...二进制文件的读写速度非常快,因为它就是将数据在内存中的存储形式(二进制)原模原样放到文件中,读出.
  • 二进制文件存储的优点
  • 文本文件和二进制文件,能用记事本打开的就是文本文件,不能用记事本打开的就是二进制文件
  • 百度知道 里面有位大佬说:定义和存取方式上二进制文件与文本文件存在区别。1、定义上的区别文本文件:文本文件是一种计算机文件,它是一种典型的顺序文件,其文件的逻辑结构又属于流式文件。简单的说,文本文件是...
  • 文本文件与二进制文件区分和优缺点
  • c++读写二进制文件

    2022-06-15 10:03:56
    C++读写二进制文件
  • 二进制文件替换数据

    2021-01-29 08:46:22
    昨天一个好朋友,找我帮忙:说想定向的修改二进制文件指定位置的数据,希望我能写个脚本,通过某个 csv 文件里面的 定位数据,和对应值,以及数位长度进行修改。要处理的数据文件:替换的数据:csv文件的数据:问了好...
  • UEFI-BootLoader概览 概览它是一个 UEFI 应用程序,它在内存中加载和执行 elf 格式和原始二进制格式文件。 使用。 它是一个最小的实现,也可以作为 UEFI 的研究。我做它的重点是对代码的理解。特征简单的容易明白...
  • 最近解析 png 数据文件, 发现一个文件操作中容易忽略的问题,问题描述如下:使用 fread 读二进制文件(png 图片)的时候, 发现读取到内存中的数据和 二进制文件中的数据不一致, 同样, 使用 fwrite 写二进制...
  • 读取文件中的二进制文件并将二进制转换成文本文档并输出

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 499,168
精华内容 199,667
热门标签
关键字:

二进制文件在内存