整数编码
Swf 9及以后版本支持对可变字节数的整数进行编码。支持一种该整数编码方式
浮点类型
类型 | 描述 |
EncodedU32 | 可变长32位无符号整数编码 |
这是一个将字节可变数存储的32位无符号整数值编码。所有的EncodedU32是根据值大小进行1到5字节的编码(数值越大需要空间越多),这种编码方式就是如果当前字节的起始位被设置了,那么下一字节也是这个数值的一部分。一个字节其中7位是值,而起始位告诉我们下一个字节是否属于这个数值,或者该字节就是这个数值的最后一个字节。
这个算法用来解析EncodedU32:
int GetEncodedU32(unsigned char*& pos){ int result = pos[0]; if (!(result & 0x00000080)){ pos++; return result; } result = (result & 0x0000007f) | pos[1]<<7; if (!(result & 0x00004000)){ pos += 2; return result; } result = (result & 0x00003fff) | pos[2]<<14; if (!(result & 0x00200000)){ pos += 3; return result; } result = (result & 0x001fffff) | pos[3]<<21; if (!(result & 0x10000000)){ pos += 4; return result; } result = (result & 0x0fffffff) | pos[4]<<28; pos += 5; return result; }
位值
位值是一种可变位长度区域用来表示三种类型的数字:
1. 无符号整数
2. 符号整数
3. 16.16的固定小数位符号数
位值不需要字节对齐。其他类型(比如UI8和UI16)必须要字节对齐。如果一个字节对齐的值跟在位值的后面,那么这个位值的最后一个字节用0补齐。
下面是一个64位流的例子。这64个位中包含9个不定位长的值和一个UI16的值:
这个位流的开始是一个6位的值(BV1),接着是一个5位的值(BV2),包含了Byte1的末尾和Byte2的开始,BV3包含Byte2的末尾和Byte3的开始,BV4整个在Byte3里面,Byte5包含两个位值:BV7和BV8,BV9后面接了一个字节对齐类型(UI16),所以Byte6的最后4个位用0补齐。
位值
类型 | 描述 |
SB[nBits] | 有符号位值(nBits是存储这个值的使用的位数) |
UB[nBits] | 无符号位值(nBits是存储这个值的使用的位数) |
FB[nBits] | 有符号固定小数位值(nBits是存储这个值的使用的位数) |
当一个无符号位值扩展为一个更长长度的值时,它最左边的所有位用0填充。当一个有符号位值扩展为一个更长长度的值时,它最左边的所有位用原始值的最高位填充。
这种扩展称为符号延伸。例如,一个4位无符号数UB[4] = 1110在扩展为16位时就变成:0000 0000 0000 1110 = 14。对于一个位值相同的有符号数SB[4] = 1110在扩展为16位时就变成:1111 1111 1111 1110 = -2。有符号位值是类似的但是得记录符号位。有符号数35表示为SB[7] = 0100011。这个附加的位0是必须的;否则最高位作为符号位就变成负数了。