#include <stdio.h>
FILE *fp;
// Tag_header__Start
struct Tag_header{
char Header[3]; // It must be 'ID3'
char ver; // The version of ID3
char ReVer; // the subversion of ID3
char Flag;
char Size[4];
};
// Tag_header__End
// Tag_Trailer__Start
struct Tag_Trailer{
char Header[3];
char Title[30];
char Artist[30];
char Album[30];
char Year[4];
char Comment[30];
char Cenre[1];};
// Tag_GetTrailer__End
struct Tag_header Mp3Header;
struct Tag_Trailer Mp3Trailer;
main()
{
// 01.mp3是我测试时用的MP3的名称
fp = fopen("01.mp3","r+");
if(fp == NULL)
{
printf("No such file");
}
else
{
Tag_GetHeader();
Tag_GetTrailer();
}
printf("\n%s\n",Mp3Trailer.Title);
printf("%s\n",Mp3Trailer.Artist);
printf("%s\n",Mp3Trailer.Album);
printf("%s\n",Mp3Trailer.Year);
printf("%s\n",Mp3Trailer.Comment);
fclose(fp);
}
void Tag_GetTrailer()
{
// Get Header
fseek(fp,-128,SEEK_END);
fread(Mp3Trailer.Header,3,1,fp);
// Get Title
fseek(fp,-125,SEEK_END);
fread(Mp3Trailer.Title,30,1,fp);
// Get Artist
fseek(fp,-95,SEEK_END);
fread(Mp3Trailer.Artist,30,1,fp);
// Get Album
fseek(fp,-65,SEEK_END);
fread(Mp3Trailer.Album,30,1,fp);
// Get Year
fseek(fp,-35,SEEK_END);
fread(Mp3Trailer.Year,4,1,fp);
// Get Comment
fseek(fp,-31,SEEK_END);
fread(Mp3Trailer.Comment,30,1,fp);
// Get Cenre
fseek(fp,-1,SEEK_END);
fread(Mp3Trailer.Cenre,1,1,fp);
}
void Tag_GetHeader()
{
// Get ID3 Tag
fseek(fp,0,SEEK_SET);
fread(Mp3Header.Header,sizeof(Mp3Header.Header),1,fp);
// Get ID3 Version
fseek(fp,3,SEEK_CUR);
fread(Mp3Header.ver,sizeof(Mp3Header.ver),1,fp);
// Get ID3 Revision
fseek(fp,4,SEEK_CUR);
fread(Mp3Header.ReVer,sizeof(Mp3Header.ReVer),1,fp);
// Get ID3 Flag
fseek(fp,5,SEEK_CUR);
fread(Mp3Header.Flag,sizeof(Mp3Header.Flag),1,fp);
// Get ID3 Size
fseek(fp,6,SEEK_CUR);
fread(Mp3Header.Size,sizeof(Mp3Header.Size),1,fp);
}
相关推荐
根据提供的信息,我们可以了解到这是一段用C语言编写的“学生信息管理系统”的源代码。该系统主要用于管理学生的个人信息,如学号、姓名、性别、年龄、总分等,并且能够进行数据的添加、保存和输出等功能。下面我们...
3. 添加文件头和尾部信息:gzip格式的文件在压缩数据前有一个包含文件名、时间戳和其他元数据的头部,而在数据后有一个校验和字段,用于验证解压缩后数据的完整性。 4. 写入输出文件:将压缩后的数据以及头尾部信息...
由于ID3标签位于文件头部或尾部,可能需要跳过音频数据部分,直接读取标签区域。 5. 字符串处理: 解析ID3标签通常涉及查找特定的字符串标记,然后提取标记后的信息。易语言提供了“字符串查找”、“字符串截取”...
否则,读取头部数据,并更新头部指针。 4. **溢出处理**:当写入操作导致头部追上尾部时,需要进行溢出处理。这通常意味着丢弃最早写入的数据(称为“老化”或“覆盖”),或者停止写入直到有空间可用。 5. **空闲...
在这段C语言代码中,实现了二维单调队列的基本概念和应用场景。下面将从代码结构和功能上详细讲解其知识点。 首先,代码的结构分为几个部分:包含头文件、定义全局变量、定义结构体、主函数中实现逻辑和计算最小值...
在给出的代码中,`createlist()`函数首先创建一个空链表,然后不断读取用户输入的字符,将每个字符作为新的节点数据,并将新节点插入到链表头部。这种方法的优点是插入操作简单,但若频繁插入,会导致已插入的元素...
这段代码是用C语言编写的,用于实现一个双栈结构,即在一个数组中存储两个栈,一个从数组头部开始,一个从数组尾部开始,以节省空间。代码的主要功能如下: 定义了一个判断函数judge(),用于检查是否栈满,即是否top...
本实验报告和代码库主要围绕“链表信息管理”这一主题展开,旨在通过实际编程实践帮助学习者深入理解链表的工作原理及其在实际问题中的应用。 链表不同于数组,它不需要连续的内存空间来存储元素,每个节点包含数据...
2. 记录的插入:在链表中添加新的学生信息,可以通过在链表的头部、尾部或根据特定条件(如ID匹配)进行插入。 3. 记录的修改:根据用户提供的ID或其他标识找到特定的节点,并更新其信息。 4. 记录的删除:根据...
- 解码时,从输入文件读取码字,根据码字的长度和位置信息在滑动窗口中查找并复制相应的字符序列,重建原始数据。解码过程同样需要队列操作和滑动窗口管理。 8. **效率优化**: - 实现时可以考虑使用哈希表来加速...
Java代码中首先读取输入并初始化数组和变量,然后通过循环计算出从两端取香蕉的最大数量。 - **Python代码示例**: Python代码同样实现了上述逻辑,但使用了更简洁的语法,例如列表推导式和内置函数。 - **...
### 约瑟夫环C语言实现代码解析 #### 知识点一:约瑟夫环问题背景与定义 约瑟夫环问题是一个经典的计算机科学问题,源自于犹太历史学家约瑟夫斯所记载的一个事件。问题描述如下:n个人围成一个圈,从某个人开始报...
4. 如果页面不在物理块中,且物理块已满,从链表尾部移除最近最少使用的页面(即最久未被访问的页面),然后将新页面添加到链表头部。 5. 记录每次淘汰操作,统计缺页次数。 6. 最后,程序输出四个物理块中存储的...
3. **Inc.asp**:这个文件很可能是包含了一些共用的函数或变量,比如头部和尾部的HTML代码、用户登录状态的检查或者全局设置,这样可以在多个页面之间复用代码,提高效率。 4. **book.asp**:可能代表一个“笑话...
### 约瑟夫实验代码 C语言解析 #### 一、背景介绍 约瑟夫问题是一个经典的计算机科学问题,源自于犹太历史学家约瑟夫斯的一个故事。在这个问题中,人们围成一个圈,并按照一定的规则报数,每轮报数到指定数字的人将...
### 链式队列的算法C代码解析 #### 一、引言 在计算机科学领域,队列是一种常见的数据结构,它遵循先进先出(FIFO)的原则。队列可以分为数组实现的循环队列和链表实现的链式队列。本文将详细介绍链式队列的算法...
- `jpg_enc.ncb`、`jpg_enc.opt` 和 `jpg_enc.plg` 文件是Visual Studio的辅助工程文件,保存了用户界面状态、编译优化信息和调试设置。 - `src` 文件夹通常包含实际的源代码文件,如C++或C语言的源码。 - `SI` ...
头部包含了时间戳、文件权限等元信息,而尾部则包含了一个CRC32校验和,用于验证数据的完整性和正确性。 DEFLATE算法是GZIP的核心,它结合了LZ77滑动窗口压缩(寻找重复的字符串并用长度和偏移量表示)和霍夫曼编码...
2. 插入学生信息:在链表的头部或尾部插入新节点,需要创建新的节点并设置其数据,然后更新指针关系。 3. 查找学生信息:遍历链表,根据学号或姓名找到对应的学生信息。 4. 更新学生信息:找到要修改的学生节点,...
4. **数据队列**:在C语言中,可以使用结构体来定义队列,包括队列的头部、尾部指针以及元素数组。当生产者将数据放入队列时,它会更新队列的尾部指针;消费者取出数据时,更新头部指针。 5. **线程创建与销毁**:`...