- 浏览: 237726 次
- 性别:
- 来自: 南京
-
最新评论
-
baby8117628:
vc下mp3 IDv1和IDV2的读取 -
gezexu:
你好,我按照你的步骤一步步进行但是安装libvorbis的时候 ...
linux如何搭建强大的FFMPEG环境 -
ini_always:
帅哥,转载也把格式做好点,另外出处也要注明一下吧。。。
MP3文件格式解析
在嵌入式系统中,一般不建议使用union结构,因为union结构中的各个成员之间存在相互影响,容易滋生问题。可见,union也是把双刃剑。懂得使用它的人可以做到“削铁如泥”,而不懂得使用它的人很可能会被其所伤。下面介绍的几种方法都是嵌入式系统常用的几种技巧。如果熟练掌握,将来定有所用。
1.all的使用
使用all的数据结构模型:
typedef _my_union
{
unsigned int all;
/*sizeof(my_union.my_struct)必须与sizeof(my_union.all)相等*/
struct
{
...
}my_struct;
}my_union;
----------EXAMPLE 1--------
嵌入式系统开发者应该对Little-endian和Big-endian模式非常了解。采用Little-endian模式的CPU对操作数的存放方式是从低字节到高字节,而Big-endian模式对操作数的存放方式是从高字节到低字节。例如,32bit宽的数 0x12345678在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:
内存地址 存放内容
0x4000 0x78
0x4001 0x56
0x4002 0x34
0x4003 0x12
而在Big-endian模式CPU内存中的存放方式则为:
内存地址 存放内容
0x4000 0x12
0x4001 0x34
0x4002 0x56
0x4003 0x78
联合体union的存放顺序是所有成员都从低地址开始存放,利用该特性就可以轻松地获得了CPU对内存采用Little-endian还是Big-endian模式读写。
测试代码:
int isLittleEndian()
{
union _dword
{
int all;
struct _bytes
{
char byte0;/*对little来说是最低位,而对big则是最高位*/
char pad[3];
}bytes;
}dword;
dword.all=0x87654321;/*all的功能就是给dword四个字节赋值*/
return (0x21==dword.bytes.byte0);/*查看第一个字节*/
}
分析: 如果你的处理器调用函数isLittleEndian返回1,那么说明你的处理器为little endian,否则为big endian.注意,如果在little endian处理器上,byte0和pad按内存从低到高的存放顺序:LOW->byte0 pad[0] pad[1] pad[2] ->HIGH;0x87654321按内存从低到高的存放顺序: 0x21 0x43 0x65 0x87, 可见byte0对应到0x21。所以通过判断dword中第一个字节dword.bytes.byte0是否与0x21相等就可以看出是否是little endian。
----------EXAMPLE 2--------
#include <stdio.h>
typedef union _student
{
unsigned int all;/*all可以同时清理或设置info中的所有内容*/
struct
{
unsigned int pad: 7;
unsigned int used: 1;/*高位*/
unsigned int personal_id: 8;
unsigned int class_id: 3;
unsigned int subject_id: 6;
unsigned int score: 7;/*低位*/
}info;
}student;
#define MAX_STUDENT_NUM 100
unsigned int students;
unsigned int student_database[MAX_STUDENT_NUM]={0};
int add_to_database(unsigned int data);
int find_from_database(unsigned int personal_id);
int delete_from_database(unsigned int personal_id);
void print_database(void);
void print_student(unsigned int data);
int add_to_database(unsigned int data)
{
student stu;
int i;
for(i=0;i<MAX_STUDENT_NUM;i++)
{
stu.all = student_database[i];
if(!stu.info.used)
{
stu.all = data;
stu.info.used = 1;
student_database[i] = stu.all;
return 1;
}
}
return 0;
}
int find_from_database(unsigned int personal_id)
{
student stu;
int i;
for(i=0;i<MAX_STUDENT_NUM;i++)
{
stu.all = student_database[i];
if(stu.info.used && stu.info.personal_id==personal_id)
{
return stu.all;
}
}
return -1;
}
void print_student(unsigned int data)
{
student stu;
stu.all = data;
printf("personal id %d,class id %d,subject id %d,score %d\n",
stu.info.personal_id,stu.info.class_id,stu.info.subject_id,
stu.info.score);
}
void print_database(void)
{
student stu;
int i;
for(i=0;i<MAX_STUDENT_NUM;i++)
{
stu.all = student_database[i];
if(stu.info.used)
{
print_student(stu.all);
}
}
}
int main(int argc, char *argv[])
{
student jack,jone;
jack.all = 0;
jack.info.personal_id = 102;
jack.info.class_id = 2; /*class 2*/
jack.info.subject_id = 2; /*English*/
jack.info.score = 50; /*fouled*/
add_to_database(jack.all);
jone.all = 0;
jone.info.personal_id = 88;
jone.info.class_id = 2; /*calss 2*/
jone.info.subject_id = 2; /*English*/
jone.info.score = 73; /*passed*/
add_to_database(jone.all);
jack.all = find_from_database(jack.info.personal_id);
if(jack.all<0)
{
printf("no such student with id %d\n",jone.info.personal_id);
}
else
{
printf("found! ");
print_student(jack.all);
}
print_database();
}
运行结果:
found! personal id 102,class id 2,subject id 2,score 50
personal id 102,class id 2,subject id 2,score 50
personal id 88,class id 2,subject id 2,score 73
发表评论
-
内存屏障
2010-02-26 11:03 1523处理器的乱序和并发执行 目前的高级处理器,为了提高内部逻辑元 ... -
函数调用堆栈分析
2010-02-26 10:53 1392理解调用栈最重要的两 ... -
mtrace检测内存泄露
2010-02-25 09:50 1108[url] http://math.acadiau.ca/AC ... -
c语言编程之字符串操作
2010-02-25 09:41 8781. //在s串中查找与s1相匹配的字符串,找到后用 ... -
linux C 链接库 so制作及调用[转]
2010-02-24 16:26 2598文章分类:C++编程 [文章作者:陈毓端 若转载请标注原文链 ... -
mtrace的使用
2010-02-24 16:02 1346对于内存溢出之类的麻烦可能大家在编写指针比较多的复杂的程序的时 ... -
单片机的C语言中位操作用法(转
2010-02-24 14:27 2226单片机的C语言中位操作用法 作者:郭天祥 在对单处机进 ... -
Linux下的itoa函数
2010-02-21 17:55 1789上篇文章说到linux需要it ... -
va_list、va_start、va_arg、va_end的原理与使用
2010-02-05 10:34 29261. 概述 由于在C语言中没有函数重载,解 ... -
快速排序(quickSort)
2010-02-04 10:50 8811. #include <stdio.h> ... -
C问题---itoa函数
2010-02-04 10:36 1075------------------------------ ... -
itoa函数及atoi函数
2010-02-04 10:35 1340C语言提供了几个标准库函数,可以将任意类型(整型、长整型、浮点 ... -
结构体零长度数组的作用
2010-02-04 10:21 1388在一些 C 语言编写的代码中,有时可以看到如下定义的结构: ... -
优化C代码常用的几招
2010-02-04 10:14 789性能优化方面永远注意8 ... -
我经常去的网站
2010-02-03 17:53 1645MFC相关网站 www.codeproject.com ht ... -
可重入函数与不可重入函数
2010-02-03 16:35 947原文地址:http://blog.chin ... -
linux线程池及其测试
2010-02-03 16:32 2375/*----------------------------- ... -
哈夫曼编码
2010-02-03 16:26 1326本文描述在网上能够找到的最简单,最快速的哈夫曼编码。本方法不使 ... -
优化变成了忧患:String.split引发的“内存泄露”
2010-02-01 17:39 1126一直赞叹Sun对待技术的 ... -
锁无关的(Lock-Free)数据结构——在避免死锁的同时确保线程
2010-01-26 14:47 917http://hi.baidu.com/%5F%E2%64%5 ...
相关推荐
### SQL语句 UNION 和 UNION ALL 使用详解 #### 一、SQL UNION 和 UNION ALL 的基本概念 **UNION** 和 **UNION ALL** 是 SQL 语言中用于合并两个或多个 SELECT 语句结果集的关键字。这两种操作符都可以帮助我们...
UNION ALL 用于合并两个或多个 SELECT 语句的结果集,使用方法是将每个 SELECT 语句用 UNION ALL 连接起来。例如: ```sql SELECT 'china' AS col_1, 'america' AS col_2, 'canada' AS col_3, -1 AS status FROM ...
在 mapping 中使用 Union Transformation,可以连接多个输入组,从不同的分支,在一个 pipeline 或者不同 pipeline。当你添加一个 Union Transformation 到 mapping,你必须检查你连接的所有输入组的同一个 port。...
MySQL中union和order by是可以一起使用的,但是在使用中需要注意一些小问题,下面通过例子来说明。首先看下面的t1表。...因为union在没有括号的情况下只能使用一个order by,所以报错,这个语句有2种修改方
python计算3D IoU(3D Intersection-over-Union,IoU)代码
2. **使用UNION ALL合并结果**:将这些子查询通过`UNION ALL`合并起来,形成一个新的结果集。 3. **添加外键关联**:通过主键或其他唯一标识符,将这些子查询结果关联起来,以确保行与行之间的正确匹配。 #### 示例...
本程序中定义了一个结构体,其成员有一个union,union中又定义了一个结构体,很好的体现了使用union的方法
### Struct和Union结构体和联合体的区别 #### 一、基本概念 - **Struct(结构体)*...- **注意事项**:由于`union`中的成员共享同一段内存空间,因此对一个成员的修改会影响到其他成员的值,这在使用时需要特别注意。
在上面的代码中,我们定义了一个名为 EthCellType 的 union,该 union 由两个成员组成:eth_frame 和 Mem。eth_frame 是一个 struct,用于存储以太网帧的各个部分;Mem 是一个压缩数组,用于存储数据。 在以太网...
在上面的示例中,我们使用 union 操作将两个查询结果合并成一个结果集。结果集中的每一行都是唯一的,没有重复行。 union all 操作 Union all 操作与 union 操作类似,但 union all 操作不会去除重复行。 union ...
在MySQL数据库中,进行数据查询时,我们经常需要使用到`OR`、`IN`和`UNION ALL`这些操作符。这些操作符在不同的场景下有不同的效率表现,但并不是像网络上普遍认为的那样,`UNION ALL`总是比`OR`和`IN`更快。实际上...
以上定义了一个名为`TestUnion`的**union**类型,其中包含了两个成员:一个整型变量`office`和一个字符数组`teacher`。 #### 五、如何声明Union变量? 声明**union**变量的方法有以下几种: 1. 先定义再声明: ```...
- **销售报告**:如果你正在生成一个销售报告,汇总不同地区的销售额,可能需要使用`UNION ALL`,因为每个地区的销售额可能会有重复的交易记录。 - **用户注册统计**:如果你需要统计网站的唯一注册用户数,应该...
在ARM寄存器另类定义UNION中,还使用volatile union编译指令来定义一个联合体,例如: ```c volatile union { unsigned char strack; __BIT8 strack_bit; } @0x00800000; ``` 这个联合体定义了两个变量,strack和...
- **分析**:在这个例子中,当`number.i`被赋值为`0x4241`时,对应的`half.first`和`half.second`分别代表了`'A'`和`'B'`的ASCII码。随后对`half.first`和`half.second`的赋值会覆盖原来的值,因此最后输出的是`"ab...
- **组合多表**:可以同时使用多个`UNION`操作符连接多个`SELECT`语句。 综上所述,`UNION`在处理多个数据源时非常有用,尤其当需要合并来自不同表的相似数据时。通过正确地使用`UNION`,可以简化复杂的查询过程并...
在IT领域,尤其是在嵌入式系统开发中,C语言是不可或缺的基础工具。...同时,“C语言测试:想成为嵌入式程序员应知道的0x10个基本问题_files”可能包含了相关练习的源代码或辅助资料,供你进一步研究和实践。
3. UNION 语句可以使用多个 SELECT 语句,中间使用 UNION 或 UNION ALL 连接。 MySQL UNION 与 UNION ALL 的区别在于,UNION 会删除结果集中重复的记录,而 UNION ALL 则会把所有的记录返回。 UNION ALL 的效率高于...
1. **合并不同表的数据**:假设你有两个表`Employees1`和`Employees2`,它们都有`ID`, `Name`, 和 `Position`列,你可以用`UNION`来合并这两个表的员工信息。 ```sql SELECT ID, Name, Position FROM Employees1...
根据提供的部分文件内容,我们可以看到一个具体的例子来理解如何使用`UNION ALL`: 假设我们有两个表,一个是`Store_Information`,另一个是`Geography`。`Store_Information`表包含了商店名称、销售额和日期;而`...