无名工匠
C++博客
首页
新随笔
联系
聚合
管理
随笔-5 评论-11 文章-0 trackbacks-0
从wave文件的读写看程序中struct的设计
在windows中,对于wave音频格式,有如下的一系列结构:
typedef
struct
waveformat_tag
{
WORD wFormatTag;
/**/
/**/
/**/
/*
format type
*/
WORD nChannels;
/**/
/**/
/**/
/*
number of channels (i.e. mono, stereo, etc.)
*/
DWORD nSamplesPerSec;
/**/
/**/
/**/
/*
sample rate
*/
DWORD nAvgBytesPerSec;
/**/
/**/
/**/
/*
for buffer estimation
*/
WORD nBlockAlign;
/**/
/**/
/**/
/*
block size of data
*/
}
WAVEFORMAT;
typedef
struct
pcmwaveformat_tag
{
WAVEFORMAT wf;
WORD wBitsPerSample;
}
PCMWAVEFORMAT;
struct
TWavHeader
{
char
rId[
4
];
//
标志符(RIFF)
DWORD rLen;
//
数据大小,包括数据头的大小和音频文件的大小
char
wId[
4
];
//
格式类型("WAVE")
char
fId[
4
];
//
"fmt"
DWORD fLen;
//
Sizeof(PCMWAVEFORMAT)
PCMWAVEFORMAT wavFormat;
char
dId[
4
];
//
"data"
DWORD wSampleLength;
//
音频数据的大小
}
;
采用这样的结构写的音频文件,文件头会有如下的结果:
不难发现,第0020行明显多出几个字节。这样造成声音文件无法播放出来。
从结构定义角度来看,也不难发现PCMWAVEFORMAT结构中,WAVEFORMAT结构前四个成员已经4字节对齐了,最后一个成员nBlockAlign只占用两字节,按照字节对齐规则,需要在填充两个无效字节,从而保证到4字节对齐;PCMWAVEFORMAT结构还是采用4字节对齐,因此只占用两字节的
最后一个成员wBitsPerSample还需要两字节补齐,因此才有了上图的字节分布。
解决方法就是采用紧缩结构,不允许字节对齐。
从这个亲身经历来看,字节非对齐的结构也是一种潜在的bug,程序中设计的各种结构尽量保持字节对齐是一种好的习惯。
posted on 2008-06-16 11:00
Wealth
阅读(1198)
评论(4)
编辑
收藏
引用
所属分类:
C++
评论:
#
re: 从wave文件的读写看程序中struct的设计 2008-06-16 11:21 |
Kevin Lynx
有道理,对于用struct写文件这种情况,很容易因为struct的字节对齐问题导致想不到的BUG。尤其是采用直接将struct以二进制方式写入文件的方式写文件。
回复
更多评论
#
re: 从wave文件的读写看程序中struct的设计 2008-06-17 19:56 |
Wealth
@Kevin Lynx
对呀,这些bug一般还很难找。
回复
更多评论
#
re: 从wave文件的读写看程序中struct的设计 2008-06-23 01:10 |
R2仔
用 #pragma pack(2) 来改变字节对齐设置也可以吧
回复
更多评论
#
re: 从wave文件的读写看程序中struct的设计
2008-06-24 14:55 |
Wealth
@R2仔
在这个应用中是可以的。
但我们在这里讨论的不是几个字节对齐的问题,而是如何避免由于潜在的机制而导致的bug
回复
更多评论
刷新评论列表
标题
姓名
主页
验证码
*
内容(提交失败后,可以通过“恢复上次提交”恢复刚刚提交的内容)
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
相关文章:
初探数据表现层和业务逻辑层的分离
从wave文件的读写看程序中struct的设计
相关链接:
网站导航:
博客园
BlogJava
博客生活
IT博客网
C++博客
PHP博客
博客园社区
管理博客
教师博客
天文博客
汽车博客
足球博客
股票博客
电子博客
管理
<
2008年6月
>
日
一
二
三
四
五
六
25
26
27
28
29
30
31
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
1
2
3
4
5
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
给我留言
查看公开留言
查看私人留言
随笔分类
(3)
C++(2)
Qt(1)
随笔档案
(5)
2008年6月 (5)
文章分类
Algorithm
Linux
Pattern
STL
Tools
Around Web
google's lab
My del.icio.us
CoBlog
explain boost source code
Develop Usage Link
cppreference
CSDN
IBM Developer Center
MSDN in chinese
sourceforge.net
搜索
最新评论
1. re: 初探数据表现层和业务逻辑层的分离
评论内容较长,点击标题查看
--Wealth
2. re: 初探数据表现层和业务逻辑层的分离
心里有个分离的倾向就行了,完全分离是不可能的,也是模糊的,难以理解又耽误项目进度的:D
--true
3. re: 初探数据表现层和业务逻辑层的分离
有点高不可攀,我在学习。
--企业即时通讯
4. re: 初探数据表现层和业务逻辑层的分离[未登录]
评论内容较长,点击标题查看
--紫云追雪
5. re: 初探数据表现层和业务逻辑层的分离
看了我自己的评论之后突然想起了某文(Why I Hate Framework)中所提到的IFactoryFactoryFactory。你可以去看看。
--陈梓瀚(vczh)
阅读排行榜
1. 从wave文件的读写看程序中struct的设计(1198)
2. 初探数据表现层和业务逻辑层的分离(1098)
3. Valgrind手册翻译(166)
4. Qt中的new和delete(156)
5. fcntl函数(80)
评论排行榜
1. 初探数据表现层和业务逻辑层的分离(7)
2. 从wave文件的读写看程序中struct的设计(4)
3. fcntl函数(0)
4. Valgrind手册翻译(0)
5. Qt中的new和delete(0)