智慧 + 毅力 = 无所不能

正确性、健壮性、可靠性、效率、易用性、可读性、可复用性、兼容性、可移植性...
随笔 - 991, 文章 - 0, 评论 - 27, 阅读 - 341万

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

解析SWF文件头中的Rect结构

Posted on   Bill Yuan  阅读(1830)  评论(0编辑  收藏  举报

转自:http://www.wwswf.com/?p=897

 

swf头中的Rect结构是按照位进行存储的,而不是字节,因为存储的值是跨字节的,而且存储的单位是twip,相当于二十分之一像素。

Rect结构中包含四个信息,按照顺序依次为:Xmin、Xmax、Ymin、Ymax,分别表示 X,Y轴方向上的最小和最大值。

Rect中前五位表示一个长度信息n,就是其中要存储的四个值所占用的长度,即从第六位开始,第一个n位表示Xmin,第二个n位表示Xmax,依次类推,直到取到存储的4个值,字节未用完的部分补0。

举个例子:
swf的头如下所示:

JAVA:
  1. 46 57 53 0A 4C 15 00 00 78 00 05 5F 00 00 0F A0 
  2. 00 00 12 01 00 44 11 18 00 00 00 7F 13 04 05 00

开始3个字节为FWS,0A为10,表示版本号,“4C 15 00 00 ”为文件大小,从"78"开始即可读Rect结构。
“78”的二进制代码为:01111000,前5位就是01111,十进制值为15,就是说从第六位开始,每隔15位表示一个swf尺寸值。

“78 00 05 5F 00 00 0F A0”用二进制表示为:

JAVA:
  1. 01111 000000000000000 010101011111000 000000000000000 00111110100000

那么000000000000000 十进制为0,表示Xmin,010101011111000十进制值为11000,换算成像素为550,表示Xmax,最后面的00111110100000只有14位,比15位少了一位,所以需要从后面一个字节拿一位过来,后面的字节16进制值为00,二进制值为00000000,被借了一位,那么剩余的7位都废了,即属于补0部分,至此Rect结构就结束了。

之后的00 12表示帧率,由于swf是反序存入的,所以应该按照12 00转换为十进制,即为4608,4608/256=18(因为低8位是小数,所以需要除以2的8次方),swf的帧率即为18.

再之后两位是01 00,反序之后十进制即为1,swf总帧数为1.

 

(评论功能已被禁用)
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示