在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;
}