zoukankan      html  css  js  c++  java
  • 字节对齐

    广义的二进制文件分为文本文件和狭义的二进制文件(简称二进制文件)。

    文本文件的特点是基于定长编码的,二进制文件是变长编码的,特点是多少比特代表的值是完全由我们决定的。

    二进制文件中一种比较特殊的情形就是保存相同类型的数据结构的多个值。

    例如结构体:

    struct file_test
    {
            int i;
            char c;
            short s;
    };

    写入文件

    #include <stdio.h>
    #include <fcntl.h>
    struct file_test
    {
            int i;
            char c;
            short s;
    };
    
    int main ()
    {
            struct file_test file_test_value;
            int fd;
            file_test_value.i = 1;
            file_test_value.c = 'c';
            file_test_value.s = '2';
    
            if ( (fd = open("/home/yang/documents/unix/2_chapter/test", O_WRONLY)) == -1 )
            {
                    perror("open");
                    return -1;
            }if ( write(fd, &file_test_value, sizeof(file_test_value)) == -1 )
            {
                    perror("write");
                    return -1;
            }
    
            close(fd);
    
            printf("the sizeof struct: %d\n",sizeof(file_test_value));
            return 0;
    }

    查看写入的信息

    yang@UbuntuPc:~/documents/unix/2_chapter$ hexdump test 
    0000000 0001 0000 0063 0032                    
    0000008

    而如何写入与编译器相关

    如果添加下来这句话则,写入的信息为

    #pragma pack(1)
    yang@UbuntuPc:~/documents/unix/2_chapter$ hexdump test 
    0000000 0001 0000 3263 0000                    
    0000008

    采用不同的对其方式,编译器保存的其实位置就不同

    字节对齐:http://www.cnblogs.com/logogcn/archive/2010/11/30/1891699.html

    几个概念:

    1.数据类型自身的对齐值:
       对于char型数据,其自身对齐值为1,对于short型为2,对于int,float,double类型,其自身对齐值为4字节

    2.结构体或者类的自身对齐值:其成员中自身对齐值最大的那个值。
    3.指定对齐值:#pragma pack (value)时的指定对齐值value。
    4.数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中小的那个值。

    有效对齐值N是最终用来决定数据存放地址方式的值,最重要。有效对齐N,就是 表示“对齐在N上”,也就是说该数据的"存放起始地址%N=0".

  • 相关阅读:
    .netcore初体验
    ASP.NET MVC实现单用户登录
    远程连接桌面报:这可能是由于credssp加密oracle修正
    想起以前写的一个爬虫,然后就用C#WinForm写了一个下载小说的软件,比较简单
    List泛型与DataTable相互转换
    SqlServer-触发器
    SqlServer-RBAC五表权限
    SqlServer通用存储过程
    用vs2017结果无法启动IIS express
    简单的叙述下SQL中行列转换的小知识!
  • 原文地址:https://www.cnblogs.com/yangqionggo/p/2878702.html
Copyright © 2011-2022 走看看