文件数据基础知识:
1) 在IA-32架构的计算机中,数据存储的最小单位是“位”(一位能表示两种状态:0和1);
按CPU一次处理的位数,可将CPU分为8位、16位、32位和64位。
2) CPU被设计为擅长处理2的N次幂的位数,所以用CPU处理非2的N次幂的位数会破坏流水线,导致指令的执行效率低下,因此数据一般是不会采用非2的N次幂的位数来存储的。
3) 通常情况下为了获得高的处理效率,CPU处理数据的最小单位是8个位。因为如果要处理少于一字节(8位)的数据,CPU通常要使用移位指令和逻辑指令来提取位数据,这样将导致处理效率非常低。况且内存是以字节为单位存放数据的。
4) 把不同的字节数据组织在一起,就形成文件。字节是文件系统可以处理的最小单位,对于文件格式的分析主要是对字节这个层面的分析。
5) Visual C++ 6.0编译的整型(int)、字符型(char)、长整型(long)占用的字节数分别是:2、1、4。
6) 字符串有两个主要的属性:一是字符串的长度,二是字符串的数据。
字符串存储格式常见的有两种:
6.1)长度+字符数据;
这种格式的字符串通常是使用PASCAL或Delphi编译的。其优点是处理字符串之前就可以知道字符串的长度,缺点是通常需要使用多于1字节的空间来存储字符串的长度(由于1字节能表示的数值范围是0~255,所以只用1字节来存储其长度的话,那么该字符串最大长度也只能是255字节);
6.2)字符数据+终止符;
这种格式字符串应用最多,C、C++、Java都是这种格式的。其优点是不管字符串有多长,只需要1个字节来存储终止符;缺点是需要遍历整个字符数组直到遇见终止符才能知道字符串的长度。
7) 最后说一下文件数据的存储顺序,即所谓的“大头”和“小头”。按照习惯,人们将一个数值的高位放在左边,低位放在右边;但Intel CPU的设计师却使用相反的数据存储顺序,即把低位放左边,高位放右边,这种存储顺序称为Little-Endian,而传统的对数值的识别顺序称为Big-Endian。
大部分高级语言对数据的处理是按照Little-Endian的,如C、C++、VB、Delphi等;也有个别语言如Java是按Big-Endian顺序来处理数据的,因为Java使用它自己的虚拟机来处理数据。
单个字节是无所谓“大头”、“小头”之分的,因为计算机内存是以字节为单位的,即最小存储一个字节。
和Intel CPU不同,Motorola的PowerPC系列CPU使用Big-Endian顺序来存储数据。
除此之外,网络协议也是采用Big-Endian来传输数据的,因此,在不同电脑之间传输数据时,在发送和接受数据时都要记得进行字节顺序的转换。
附:
IA32 : 32 bits Intel Architecture (32位带宽Intel构架)
IA64 : 64 bits Intel Architecture (64位带宽Intel构架)
i386 : Intel 386 ( 老的386机器,也泛指IA32体系的CPU)
i486 : Intel 486
i586 : Intel 586 ( Pentium ,K6 级别CPU )
i686 : Intel 686 ( Pentium II, Pentium III , Pentim 4, K7 级别CPU )
以上的86 也可以叫做 x86, 通称说 x86也是指 IA32构架CPU。
x86是一个intel通用计算机系列的编号,也标识一套通用的计算机指令集合。