开始使用bbed工具研究Oracle结构时,字节的底层表示是我们容易混淆的问题,以下是我对于该问题的一些思考和总结,希望对大家的学习有所帮助,本小节以Oracle kcbh结构为例,
BBED> p kcbh
struct kcbh, 20 bytes @0
ub1 type_kcbh @0 0x06
ub1 frmt_kcbh @1 0xa2
ub1 spare1_kcbh @2 0x00
ub1 spare2_kcbh @3 0x00
ub4 rdba_kcbh @4 0x004001fe
ub4 bas_kcbh @8 0x00017af4
ub2 wrp_kcbh @12 0x0000
ub1 seq_kcbh @14 0x01
ub1 flg_kcbh @15 0x06 (KCBHFDLC, KCBHFCKV)
ub2 chkval_kcbh @16 0x73d0
ub2 spare3_kcbh @18 0x0000
frmt_kcbh字段存储的值为0xa2,ub1表示该字段大小为1 byte,那么为什么0xa2可以表示1 byte呢?为什么不是“a”表示1 byte,“2”表示1 byte,合计大小为2 bytes?
解释该问题涉及计算机基础概念,现代计算机存储和处理的信息以二值信号表示,即计算机底层只存储和处理0和1两个值,每一位二进制数字称为位(bit),8个bit称为一个字节(byte),大多数计算机使用字节做为最小的可寻址的内存单元,以0x或0X开头的数字常量被认为是十六进制的值。因此对frmt_kcbh字段的值详细解释如下,
ub1 --大小为1字节
frmt_kcbh --定义字段名称
@1 --偏移量
0xa2 --十六进制表示
问题答案:0xa2为一个字节的16进制表示。理解位(bit)、字节(byte)和十六进制表示的基础概念,是我们继续深入学习的基础。
《深入理解计算机系统》中十六进制表示法解释如下:
一个字节由8位组成,在二进制表示法中,它的值域是00000000–11111111。如果看成十进制整数,它的值域就是0–255。两种符号表示法对于描述位模式来说都不是非常方便。二进制表示法太冗长,而十进制表示法与位模式的互相转化很麻烦。替代的方法是,以16为基数,或者叫做十六进制数,来表示位模式。十六进制使用数字‘0’–‘9’以及字符‘A’–‘F’来表示16个可能的值。