最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#實(shí)現(xiàn)獲取mp3 Tag信息的方法

 更新時(shí)間:2017年07月05日 08:53:23   作者:a771948524  
這篇文章主要介紹了C#實(shí)現(xiàn)獲取mp3 Tag信息的方法,涉及C#針對(duì)MP3文件屬性的相關(guān)操作技巧,需要的朋友可以參考下

本文實(shí)例講述了C#實(shí)現(xiàn)獲取mp3 Tag信息的方法。分享給大家供大家參考,具體如下:

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
namespace Foxer_Player_1._1
{
  public struct Mp3Info
  {
    public string identify;   //TAG,三個(gè)字節(jié)
    public string Title;    //歌曲名,30個(gè)字節(jié)
    public string Artist;    //歌手名,30個(gè)字節(jié)
    public string Album;    //所屬唱片,30個(gè)字節(jié)
    public string Year;     //年,4個(gè)字符
    public string Comment;   //注釋,28個(gè)字節(jié)
    public char reserved1;   //保留位,一個(gè)字節(jié)
    public char reserved2;   //保留位,一個(gè)字節(jié)
    public char reserved3;   //保留位,一個(gè)字節(jié)
  }
  /// <summary>
  /// Mp3文件信息類(lèi)
  /// </summary>
  public class Mp3FileInfo
  {
    Mp3Info info;
    /// <summary>
    /// 構(gòu)造函數(shù),輸入文件名即得到信息
    /// </summary>
    /// <param name="mp3FilePos"></param>
    public Mp3FileInfo(String mp3FilePos)
    {
      info = getMp3Info(getLast128(mp3FilePos));
    }
    /// <summary>
    /// 獲取整理后的Mp3文件名,這里以標(biāo)題和藝術(shù)家名定文件名
    /// </summary>
    /// <returns></returns>
    public String GetOriginalName()
    {
      return formatString(info.Title.Trim()) + "-" + formatString(info.Artist.Trim());
    }
    /// <summary>
    /// 去除\0字符
    /// </summary>
    /// <param name="str"></param>
    /// <returns></returns>
    private static String formatString(String str)
    {
      return str.Replace("\0", "");
    }
    /// <summary>
    /// 獲取MP3文件最后128個(gè)字節(jié)
    /// </summary>
    /// <param name="FileName">文件名</param>
    /// <returns>返回字節(jié)數(shù)組</returns>
    public static byte[] getLast128(string FileName)
    {
      FileStream fs = new FileStream(FileName, FileMode.Open, Fileaccess.Read);
      Stream stream = fs;
      stream.Seek(-128, SeekOrigin.End);
      const int seekPos = 128;
      int rl = 0;
      byte[] Info = new byte[seekPos];
      rl = stream.Read(Info, 0, seekPos);
      fs.Close();
      stream.Close();
      return Info;
    }
    /// <summary>
    /// 獲取MP3歌曲的相關(guān)信息
    /// </summary>
    /// <param name = "Info">從MP3文件中截取的二進(jìn)制信息</param>
    /// <returns>返回一個(gè)Mp3Info結(jié)構(gòu)</returns>
    public static Mp3Info getMp3Info(byte[] Info)
    {
      Mp3Info mp3Info = new Mp3Info();
      string str = null;
      int i;
      int position = 0;//循環(huán)的起始值
      int currentIndex = 0;//Info的當(dāng)前索引值
      //獲取TAG標(biāo)識(shí)
      for (i = currentIndex; i < currentIndex + 3; i++)
      {
        str = str + (char)Info[i];
        position++;
      }
      currentIndex = position;
      mp3Info.identify = str;
      //獲取歌名
      str = null;
      byte[] bytTitle = new byte[30];//將歌名部分讀到一個(gè)單獨(dú)的數(shù)組中
      int j = 0;
      for (i = currentIndex; i < currentIndex + 30; i++)
      {
        bytTitle[j] = Info[i];
        position++;
        j++;
      }
      currentIndex = position;
      mp3Info.Title = Foxer_Player_1._1.Mp3FileInfo.byteToString(bytTitle);
      //獲取歌手名
      str = null;
      j = 0;
      byte[] bytArtist = new byte[30];//將歌手名部分讀到一個(gè)單獨(dú)的數(shù)組中
      for (i = currentIndex; i < currentIndex + 30; i++)
      {
        bytArtist[j] = Info[i];
        position++;
        j++;
      }
      currentIndex = position;
      mp3Info.Artist = Foxer_Player_1._1.Mp3FileInfo.byteToString(bytArtist);
      //獲取唱片名
      str = null;
      j = 0;
      byte[] bytAlbum = new byte[30];//將唱片名部分讀到一個(gè)單獨(dú)的數(shù)組中
      for (i = currentIndex; i < currentIndex + 30; i++)
      {
        bytAlbum[j] = Info[i];
        position++;
        j++;
      }
      currentIndex = position;
      mp3Info.Album = Foxer_Player_1._1.Mp3FileInfo.byteToString(bytAlbum);
      //獲取年
      str = null;
      j = 0;
      byte[] bytYear = new byte[4];//將年部分讀到一個(gè)單獨(dú)的數(shù)組中
      for (i = currentIndex; i < currentIndex + 4; i++)
      {
        bytYear[j] = Info[i];
        position++;
        j++;
      }
      currentIndex = position;
      mp3Info.Year = Foxer_Player_1._1.Mp3FileInfo.byteToString(bytYear);
      //獲取注釋
      str = null;
      j = 0;
      byte[] bytComment = new byte[28];//將注釋部分讀到一個(gè)單獨(dú)的數(shù)組中
      for (i = currentIndex; i < currentIndex + 25; i++)
      {
        bytComment[j] = Info[i];
        position++;
        j++;
      }
      currentIndex = position;
      mp3Info.Comment = Foxer_Player_1._1.Mp3FileInfo.byteToString(bytComment);
      //以下獲取保留位
      mp3Info.reserved1 = (char)Info[++position];
      mp3Info.reserved2 = (char)Info[++position];
      mp3Info.reserved3 = (char)Info[++position];
      return mp3Info;
    }
    /// <summary>
    /// 將字節(jié)數(shù)組轉(zhuǎn)換成字符串
    /// </summary>
    /// <param name = "b">字節(jié)數(shù)組</param>
    /// <returns>返回轉(zhuǎn)換后的字符串</returns>
    public static string byteToString(byte[] b)
    {
      Encoding enc = Encoding.GetEncoding("GB2312");
      string str = enc.GetString(b);
      str = str.Substring(0, str.IndexOf("#CONTENT#") >= 0 ? str.IndexOf("#CONTENT#") : str.Length);//去掉無(wú)用字符
      return str;
    }
  }
}

更多關(guān)于C#相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《C#文件操作常用技巧匯總》、《C#遍歷算法與技巧總結(jié)》、《C#程序設(shè)計(jì)之線(xiàn)程使用技巧總結(jié)》、《C#常見(jiàn)控件用法教程》、《WinForm控件用法總結(jié)》、《C#數(shù)據(jù)結(jié)構(gòu)與算法教程》及《C#面向?qū)ο蟪绦蛟O(shè)計(jì)入門(mén)教程

希望本文所述對(duì)大家C#程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • C# Path類(lèi)---文件路徑解讀

    C# Path類(lèi)---文件路徑解讀

    這篇文章主要介紹了C# Path類(lèi)---文件路徑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • C#單例模式Singleton的實(shí)現(xiàn)詳解

    C#單例模式Singleton的實(shí)現(xiàn)詳解

    單例模式(Singleton?Pattern)是日常開(kāi)發(fā)中最簡(jiǎn)單的設(shè)計(jì)模式之一,它提供了一種創(chuàng)建對(duì)象的最佳方式,本文主要為大家介紹的是C#單例模式的實(shí)現(xiàn)方法,需要的可以參考一下
    2023-05-05
  • C#如何優(yōu)雅的對(duì)WinForm窗體應(yīng)用程序進(jìn)行權(quán)限控制

    C#如何優(yōu)雅的對(duì)WinForm窗體應(yīng)用程序進(jìn)行權(quán)限控制

    經(jīng)常會(huì)出現(xiàn)winfrom頁(yè)面需要加載權(quán)限樹(shù),下面這篇文章主要給大家介紹了關(guān)于C#如何優(yōu)雅的對(duì)WinForm窗體應(yīng)用程序進(jìn)行權(quán)限控制的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • Unity實(shí)戰(zhàn)之制作動(dòng)畫(huà)編輯器

    Unity實(shí)戰(zhàn)之制作動(dòng)畫(huà)編輯器

    為了更方便地為UI視圖添加動(dòng)畫(huà),將動(dòng)畫(huà)的編輯功能封裝在了UI View類(lèi)中,可以通過(guò)編輯器快速的為視圖編輯動(dòng)畫(huà)。本文將通過(guò)Unity制作一個(gè)動(dòng)畫(huà)編輯器,需要的可以參考一下
    2022-02-02
  • C#畫(huà)筆Pen繪制自定義線(xiàn)的帽子

    C#畫(huà)筆Pen繪制自定義線(xiàn)的帽子

    這篇文章主要介紹了C#畫(huà)筆Pen繪制自定義線(xiàn)的帽子,實(shí)例分析了畫(huà)筆Pen的使用技巧,需要的朋友可以參考下
    2015-06-06
  • C# winfrom實(shí)現(xiàn)讀取修改xml

    C# winfrom實(shí)現(xiàn)讀取修改xml

    這篇文章主要為大家詳細(xì)介紹了C# winfrom實(shí)現(xiàn)讀取修改xml的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-05-05
  • 淺談c#.net中巧用ToString()將日期轉(zhuǎn)成想要的格式

    淺談c#.net中巧用ToString()將日期轉(zhuǎn)成想要的格式

    有時(shí)候我們要對(duì)時(shí)間進(jìn)行轉(zhuǎn)換,達(dá)到不同的顯示效果,更多的該怎么辦呢?
    2013-03-03
  • C#中的 StreamReader/StreamWriter 使用示例詳解

    C#中的 StreamReader/StreamWriter 使用示例詳解

    在 C# 開(kāi)發(fā)中,StreamReader 和 StreamWriter 是處理文本文件的核心類(lèi),屬于 System.IO 命名空間,本文將從基礎(chǔ)到高級(jí)用法,結(jié)合代碼示例,全面解析其核心功能、性能優(yōu)化及常見(jiàn)問(wèn)題解決方案,感興趣的朋友一起看看吧
    2025-03-03
  • WPF通過(guò)線(xiàn)程使用ProcessBar的方法詳解

    WPF通過(guò)線(xiàn)程使用ProcessBar的方法詳解

    這篇文章主要給大家介紹了關(guān)于WPF通過(guò)線(xiàn)程使用ProcessBar的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用WPF具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • C#關(guān)于Textbox滾動(dòng)顯示最后一行,不閃爍問(wèn)題

    C#關(guān)于Textbox滾動(dòng)顯示最后一行,不閃爍問(wèn)題

    這篇文章主要介紹了C#關(guān)于Textbox滾動(dòng)顯示最后一行,不閃爍問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04

最新評(píng)論

西华县| 乌拉特前旗| 易门县| 磐石市| 鹤壁市| 南京市| 安国市| 琼中| 肇东市| 怀远县| 瑞金市| 惠安县| 集安市| 铜川市| 福建省| 安徽省| 冀州市| 常德市| 沂南县| 志丹县| 肥西县| 文昌市| 台北市| 临海市| 景东| 长岛县| 涞水县| 南昌县| 延庆县| 南川市| 台东市| 大丰市| 德令哈市| 西畴县| 扶沟县| 潼南县| 施甸县| 报价| 高碑店市| 永吉县| 凌源市|