现在的位置: 首页 > 综合 > 正文

flash文件中RECT结构体的解析

2013年10月11日 ⁄ 综合 ⁄ 共 2450字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.