在swf_file_format_spec_v10.pdf中,对舞台大小是用一种RECT结构体来表示,根据官方文档的描述,这种结构体是这样的
//读取RECT类型 /*目前想到的方案: * 1.将这九个字节数据转化成字符窜,然后通过截取字符窜得到所要的数据, * 最后转化成整数 * 2.一个字节一个字节的截取所需要的数据,然后通过一个整数变量来将其构造而成 * */ #include <stdio.h> int getUBytes(const unsigned char *data, int start, int length); int checkSignBit(int num, int bit_n) { if(num >> (bit_n - 1)) { num = num | (~0 << bit_n); } return num; } int readRECT(const unsigned char* filebuffer) { int move; char tagMsg[100]; //舞台的长和宽所占用的字节数,一般为15或者16 unsigned short bit_n; /* x minimum position for rect * x maximum position for rect * y minimum position for rect * y maximum position for rect */ int Xmin, Xmax, Ymin, Ymax; //占用的字节数 //bit_n = (unsigned short) ((filebuffer[0] & 0xf8) >> 3); bit_n = (unsigned short) getUBytes(filebuffer, 0, 5); //Xmin, Xmax, Ymin, Ymax的读取。 Xmin = getUBytes(filebuffer, 5, bit_n); Xmin = checkSignBit(Xmin, bit_n); //printf("Xmin is %d\n", Xmin); Xmax = getUBytes(filebuffer, 5 + bit_n, bit_n); Xmax = checkSignBit(Xmax, bit_n); // printf("Xmax is %d\n", Xmax); Ymin = getUBytes(filebuffer, 5 + bit_n * 2, bit_n); Ymin = checkSignBit(Ymin, bit_n); //printf("Ymin is %d\n", Ymin); Ymax = getUBytes(filebuffer, 5 + bit_n * 3, bit_n); Ymax = checkSignBit(Ymax, bit_n); //printf("Ymax is %d\n", Ymax); sprintf(tagMsg, "the length size %d\n, Xmin is %d, Ymin is %d, Xmax is %d, Ymax is %d\n", bit_n, Xmin, Ymin, Xmax, Ymax); move = 5 + 4 * bit_n; printf("%s\n", tagMsg); if (move % 8) { return move / 8 + 1; } else { return move / 8; } return 0; } //这个是取第二种方案。 //根据所需要的比特数得到数据,该数据为无符号整形UInt int getUBytes(const unsigned char *data, int start, int length) { /*此地可能出现bug,未考虑length大小,当length<8; */ int move = 0, length_b; //将结果放置在value中。 int value = 0; int i; //开头的部分,尾巴的部分 int first_part, last_part; unsigned char mask; //move所要做的位移。 move += (start / 8); //构造mask位,即掩码位 mask = 0xff; //当start超过了8,所处的全新的位置 start %= 8; first_part = 8 - start; //当第一部分比截取的长度还要大,则只需截取这一段即可。 if (first_part > length) { value = (data[move] & (mask >> start)) >> (8 - start - length); return value; } //length占用字节数后剩余的位数 last_part = (length - first_part) % 8; //data所占的字节数 length_b = (length - first_part) / 8; //最后一位的构造 value = data[move + length_b + 1] >> (8 - last_part); //中间几位的构造 i = 0; while (length_b) { value = value | (data[move + length_b] << (last_part + i * 8)); i++; length_b--; } //第一位的构造 value = value | ((data[move] & (mask >> (8 - first_part)))<< (last_part + i * 8)); return value; } int main(int argc, char *argv[]) { //读取的二进制数据均无错误,但是第三种情况中负数的问题不清楚怎么解决 //1.Xmin = 0, Ymin = 0, Xmax = 13200, Ymax = 9900 //unsigned char *buffer = "\x78\x00\x06\x72\x00\x00\x13\x56\x00\x00"; //2.Xmin = 0, Ymin = 0, Xmax = 19200, Ymax = 12000 //unsigned char *buffer = "\x80\x00\x02\x58\x00\x00\x01\x77\x00\x00"; //3.Xmin = -450, Ymin = -611, Xmax = 490, Ymax = 543 unsigned char *buffer = "\x5e\x3e\x3d\x56\x75\x0f\x80"; readRECT(buffer); return 0; }