Mp3文件结构全解析(一)

news2025/1/22 15:54:32

Mp3文件结构全解析(一)

MP3 文件是由帧(frame)构成的,帧是MP3 文件最小的组成单位。MP3的全称应为MPEG1 Layer-3 音频
文件,MPEG(Moving Picture Experts Group) 在汉语中译为活动图像专家组,特指活动影音压缩标准,MPEG 音频文件是MPEG1 标准中的声音部分,也叫MPEG 音频层,它根据压缩质量和编码复杂程度划分为三层,即Layer-1、Layer2、Layer3, 且分别对应MP1、MP2、MP3 这三种声音文件,并根据不同的用途,使用不同层次的编码。MPEG 音频编码的层次越高,编码器越复杂,压缩率也越高,MP1 和MP2 的压缩率分别为4:1 和6:1-8:1,而MP3 的压缩率则高达10:1-12:1,也就是说,一分钟CD 音质的音乐,未经压缩需要10MB的存储空间,而经过MP3 压缩编码后只有1MB 左右。不过MP3 对音频信号采用的是有损压缩方式,为了降低声音失真度,MP3采取了“感官编码技术”,即编码时先对音频文件进行频谱分析,然后用过滤器滤掉噪音电平,接着通过量化的方式将剩下的每一位打散排列,最后形成具有较高压缩比的MP3 文件,并使压缩后的文件在回放时能够达到比较接近原音源的声音效果。

整体结构

MP3 文件大体分为四部分:TAG_V2(ID3V2),Frame, TAG_V1(ID3V1),其他说明信息

  • ID3V2 包含了作者,作曲,专辑等信息,长度不固定,扩展了ID3V1 的信息量。
  • Frame 一系列的帧,个数由文件大小和帧长决定,每个FRAME 的长度可能不固定,也可能固定,由位率bitrate 决定, 每个FRAME 又分为帧头和数据实体两部分,帧头记录了mp3 的位率,采样率,版本等信息,每个帧之间相互独立
  • ID3V1 包含了作者,作曲,专辑等信息,长度为128BYTE。
  • 其他说明信息(不重要)

ID3V2解析

ID3V2一共有四个版本,ID3V2.1/2.2/2.3/2.4,目前流行的播放软件一般只支持第三版即ID3V2.3,由于ID3V1记录在文件的末尾处,ID3V2就只能记录在文件的首部了,也是因为这个原因,对ID3V2的操作比ID3V1要慢,而且ID3V2的结构比ID3V1的结构复杂的多,但是ID3V2可以记录更多的信息,长度可变

ID3V2 主要有四个版本,现在主流的是ID3V2.3,ID3V3.4, 2.2,2.1与后面版本差异较大:2.2的Frame head id是三个字节,而2.3,2.4是四个字节.

ID3V2.3由一个标签头和若干个标签帧或者一个扩展标签头组成,至少要有一个标签帧,每一个标签帧记录一种信息,例如作曲、标题等

ID3V2.4 Overall tag structure:

 +-----------------------------+
 |      Header (10 bytes)      |
 +-----------------------------+
 |       Extended Header       |
 | (variable length, OPTIONAL) |
 +-----------------------------+
 |   Frames (variable length)  |
 +-----------------------------+
 |           Padding           |
 | (variable length, OPTIONAL) |
 +-----------------------------+
 | Footer (10 bytes, OPTIONAL) |
 +-----------------------------+

标签头

位于文件开始处,长度为10字节,结构如下:

  • char Header[3]; /*必须为“ID3”否则认为标签不存在*/
  • char Ver; /*版本号ID3V2.3 就记录3*/
  • char Revision; /*副版本号此版本记录为0*/
  • char Flag; /*标志字节,只使用高三位,其它位为0 */
  • char Size[4]; /*标签大小*/

注:标签大小,不能确定具体包括哪些内容,解析歌曲文件后,发现没有哪些字节之和会等于该值,详见下面的实例分析

标志字节一般为0,定义如下(abc000000B)

  • a:表示是否使用Unsynchronisation
  • b:表示是否有扩展头部,一般没有,所以一般也不设置
  • c:表示是否为测试标签,99.99%的标签都不是测试标签,不设置

标签大小共四个字节,每个字节只使用低7位,最高位不使用恒为0,计算时将最高位去掉,得到28bit的数据,计算公式如下:
Size=(Size[0]&0x7F)*0x200000+(Size[1]&0x7F)*0x4000+(Size[2]&0x7F)*0x80+(Size[3]&0x7F)
注意:很多文章这里面写的是Size[1]&0x7F)*0x4000,左移14位是乘以0x4000,很多文章抄来抄去,源头出问题了,所有的都会出问题

以《胡广生.mp3》为例,使用UltraEdit工具打开如下,读者可自己对照上述结构,本章结束会给出详细的结构分析
在这里插入图片描述

标签帧

每个标签帧都有10个字节的帧头(和标签头不是一个东西,虽然他们刚好都是10字节,标签头只有一个,每个标签帧都有一个帧头)和至少一个字节的内容构成,标签帧与标签头/其他标签帧无特殊字节分割,只能通过帧头信息来确定帧内容的大小。

帧头长度10字节,定义如下:

  • char ID[4]; /*标识帧,说明其内容,例如作者/标题等*/
  • char Size[4]; /*帧内容的大小,不包括帧头,不得小于1*/
  • char Flags[2]; /*标志帧,只定义了6 位*/

标识帧,常见的内容如下:

  • TIT2=标题
  • TPE1=作者
  • TALB=专集
  • TRCK=音轨格式:N/M 其中N为专集中的第N首,M为专集中共M首,N和M 为ASCII 码表示的数字
  • TYER=年代是用ASCII 码表示的数字
  • TCON=类型直接用字符串表示
  • COMM=备注格式:“eng\0备注内容”,其中eng 表示备注所使用的自然语言

ID3V2.4中,帧内容大小,计算公式如下:

Size=(Size[0]&0x7F)*0x200000+(Size[1]&0x7F)*0x4000+(Size[2]&0x7F)*0x80+(Size[3]&0x7F)

很多文章是这样的:

Size = Size[0]*0x100000000 + Size[1]*0x10000+ Size[2]*0x100 +Size[3];

其实是有问题的.
标志帧,使用每个字节的高三位,其他位均为0(abc00000B xyz00000B)

  • a – 标签保护标志,设置时认为此帧作废
  • b – 文件保护标志,设置时认为此帧作废
  • c – 只读标志,设置时认为此帧不能修改
  • x – 压缩标志,设置时一个字节存放两个BCD 码表示数字
  • y-- 加密标志
  • z-- 组标志,设置时说明此帧和其他的某帧是一组
    在这里插入图片描述

ID3V1解析

ID3 V1.0标准并不周全,存放的信息少,无法存放歌词,无法录入专辑封面、图片等。V2.0是一个相当完备的标准,但给编写软件带来困难,虽然赞成此格式的人很多,在软件中真正实现的却极少。绝大多数MP3仍使用ID3 V1.0标准。此标准是将MP3文件尾的最后128个字节用来存放ID3信息
在这里插入图片描述

实例分析

歌曲信息

<<胡广生.mp3>>

结构解析

标签头

在这里插入图片描述

标签头:10字节,00H-09H

12345678910
49443304000000031027
I(73)D(68)3(51)4(V2.4)0(revision)0(flag)0x000x030x100x27

(Size[0]&0x7F)*0x200000+(Size[1]&0x7F)*0x400+(Size[2]&0x7F)*0x80+(Size[3]&0x7F)
= (0x00&0x7F)*0x200000 + (0x03&0x7f)*0x4000 + (0x10&0x7f)*0x80 + (0x27&0x7f)
= 0x00 + 0xc000 + 0x800 + 0x27 = 0xc824 = 51239个字节

(0x00&0x7F)<<21 + (0x03&0x7f)<<14 + (0x10&0x7f)*<<7 + (0x27&0x7f)
= 0x0 + 0xC000 + 0x800 + 0x27

TIT2标签帧

在这里插入图片描述

地址字节说明
AH-DH454 49 54 32TIT2标签帧说明
EH-11H400 00 00 09帧内容大小: 9个字节
12H-13H200 00标志,均为0
14H- 1CH901 FF FE E1 80 7F 5E 1F 75帧内容
TALB标签帧

在这里插入图片描述

地址字节说明
1dH-20H454 41 4C 42TALB标签帧说明
21H-24H400 00 00 09帧内容大小: 9个字节
25H-26H200 00标志,均为0
27H- 2FH901 FF FE E1 80 7F 5E 1F 75帧内容
TPE1标签帧

在这里插入图片描述

地址字节说明
30H-33H454 50 45 31TPE1标签帧说明
34H-37H400 00 00 09帧内容大小: 9个字节
38H-39H200 00标志,均为0
27H- 2FH901 FF FE FB 4E 20 7D 50 6C帧内容
APIC标签帧

This frame contains a picture directly related to the audio file. Image format is the MIME type and subtype for the image. In the event that the MIME media type name is omitted, “image/” will be implied. The “image/png” or “image/jpeg” picture format should be used when interoperability is wanted. Description is a short description of the picture, represented as a terminated textstring. The description has a maximum length of 64 characters, but may be empty. There may be several pictures attached to one file, each in their individual “APIC” frame, but only one with the same content descriptor. There may only be one picture with the picture type declared as picture type $01 and $02 respectively. There is the possibility to put only a link to the image file by using the ‘MIME type’ “–>” and having a complete URL instead of picture data. The use of linked files should however be used sparingly since there is the risk of separation of files.

<Header for 'Attached picture', ID: "APIC">
Text encoding   $xx
MIME type       <text string> $00
Picture type    $xx
Description     <text string according to encoding> $00 (00)
Picture data    <binary data>

Picture type:

$00     Other
$01     32x32 pixels 'file icon' (PNG only)
$02     Other file icon
$03     Cover (front)
$04     Cover (back)
$05     Leaflet page
$06     Media (e.g. lable side of CD)
$07     Lead artist/lead performer/soloist
$08     Artist/performer
$09     Conductor
$0A     Band/Orchestra
$0B     Composer
$0C     Lyricist/text writer
$0D     Recording Location
$0E     During recording
$0F     During performance
$10     Movie/video screen capture
$11     A bright coloured fish
$12     Illustration
$13     Band/artist logotype
$14     Publisher/Studio logotype

在这里插入图片描述

省略
在这里插入图片描述

地址字节说明
43H-46H441 50 49 43APIC标签帧说明
47H-4AH400 01 43 65帧内容大小: 83789个字节
38H-39H200 00标志,均为0
27H- 2FH900 69 …帧内容
帧内容大小:

Size = Size[0]*0x00000000 + Size[1]*0x10000+ Size[2]*0x100 +Size[3]

=0x010x10000+0x430x100+0x65

=0x10000+0x4300+0x65

=0x14365=82789

82789 / 16 = 5174 = 0x1436
82789 % 16 = 6

0x1436 + 0x2 = 0x1438
3 + 6 = 9

实现一个MP3解析器之标签解析

根据上面分析,先要读取标签头,先读取十个字节的标签头,定义一个结构体:

struct tagheader {
  char ID[3];          // The first 4 bytes should be ID3
  char version[2];     // $03 00
  char flags;          // $abc00000 : a:unsynchronisation if set; b:extended header exist if set; c:experimental indicator if set
  char size[4];        // (total tag size - 10) excluding the tagheader;
};

读取十个字节:

struct tagheader header;
  size_t sz;

  if (read(fd, &header, sizeof(header)) < 0) {
    perror("Read File: ");
    exit(1);
  }

计算标签大小:

sz = (header.size[0] & 0x7F) * 0x200000 + (header.size[1] & 0x7F) * 0x400 + (header.size[2] & 0x7F) * 0x80 + (header.size[3] & 0x7F);

接下来遍历读取每一个标签帧,每个标签帧又有十个字节的标签帧头,同样定义一个结构体:

struct frameheader {
  char frameid[4];    // TIT2 MCDI TRCK ...
  char size[4];
  char flags[2];      // %abc00000  %ijk00000 | a 0:frame should be preserved 1:frame should be discard
};

接下来循环读取标签帧头:

struct frameheader header;
  int framesz = 0;

  int start = 0;
  while(start <= tagsize){
    if (read(fd, &header, sizeof(header)) < 0) {
      perror("Read File: ");
      return -1;
    }
    start += sizeof(header);
    if(start > tagsize){
      printf("has parsed all\n");
      return 1;
    }
    framesz = header.size[0]*0x100000000 + header.size[1]*0x10000 + header.size[2]*0x100 + header.size[3];
    start+=framesz;
    ...

计算到标签body大小后,读取标签大小内容,并且转换成可读内容:

    ...
    char* input = malloc(framesz);
    if(read(fd, input, framesz)< 0){
      printf("error");
      return -1;
    }
    if(strncmp(header.frameid, "APIC", 4) == 0){//attach picture是图片内容,不可以转为文字
      printf("The %s is:\t\t Attach Picture, size = %d\n", header.frameid, framesz);
      continue;
    }
    framesz -= 1;   // framesz include the encode of the ID, so minus the encode byte; depend on the type of the tagid.
    if (framesz <= 0) continue;
    char* encode = (*input == 1)? "UTF-16" : "GB18030";  // The biggest problem is here, hard to know encode,so just guess

    size_t outsize = framesz * 2;
    char* result = malloc(outsize);
    bzero(result, outsize);

    char *temp = input+1;
    if (strncmp(header.frameid, "PRIV", 4) == 0) {   // PRIV's handle is a bit of special, still don't understand 
      encode = "ISO-8859-1";
      temp = input;
      framesz +=1;
    }
  
    if ((doconv(temp, framesz, encode, result, outsize)) == -1) {
      perror("doconv: ");
      continue;
    }
    printf("The %s is:\t\t%s, size = %d\n", header.frameid, result, framesz);
    free(result);
  }

到此为止,已经可以把所有的标签内容读取成功并打印了.详细代码参考:
https://github.com/qingkouwei/mp3parser

Mp3格式定义参考官网:
http://id3.org/id3v2.4.0-structure

附录

帧标识

  • AENC:Audioencryption
  • APIC:Attached picture
  • COMM:Comments
  • COMR:Commercial
  • ENCR:Encryptionmethod registration
  • EQUA:Equalization
  • ETCO:Event timingcodes
  • GEOB:Generalencapsulated object
  • GRID:Groupidentification registration
  • IPLS:Involvedpeople list
  • LINK:Linkedinformation
  • MCDI:Music CDidentifier
  • MLLT:MPEGlocationlookup table
  • OWNE:Ownership
  • PRIV:Private
  • PCNT:Playcounter
  • POPM:Popularimeter
  • POSS:Positionsynchronisation
  • RBUF:Recommendedbuffer size
  • RVAD:Relativevolume adjustment
  • RVRB:Reverb
  • SYLT:Synchronizedlyric/text
  • SYTC:Synchronizedtempo codes
  • TALB:Album/Movie/Showtitle
  • TBPM:BPM(beats perminute)
  • TCOM:Composer
  • TCON:Content type
  • TCOP:Copyrightmessage
  • TDAT:Date
  • TDLY:Playlistdelay
  • TENC:Encoded by
  • TEXT:Lyricist/Textwriter
  • TFLT:Filetype
  • TIME:Time
  • TIT1:Content groupdeion
  • TIT2:Title/songname/contentdeion
  • TIT3:Subtitle/Deionrefinement
  • TKEY:Initial key
  • TLAN:Language(s)
  • TLEN:Length
  • TMED:Media type
  • TOAL:Originalalbum/movie/show title
  • TOFN:Originalfilename
  • TOLY:Originallyricist(s)/text writer(s)
  • TOPE:Originalartist(s)/performer(s)
  • TORY:Originalrelease year
  • TOWN:Fileowner/licensee
  • TPE1:Leadperformer(s)/Soloist(s)
  • TPE2:Band/orchestra/accompaniment
  • TPE3:Conductor/performerrefinement
  • TPE4:Interpreted,remixed, or otherwise modified by
  • TPOS:Partof a set
  • TPUB:Publisher
  • TRCK:Tracknumber/Position in set
  • TRDA:Recordingdates
  • TRSN:Internetradio station name
  • TRSO:Internetradio station owner
  • TSIZ:Size
  • TSRC:ISRC(internationalstandard recording code)
  • TSSE:Software/Hardwareand settings used for encoding
  • TYER:Year
  • TXXX:Userdefinedtext information
  • UFID:Unique fileidentifier
  • USER:Terms of use
  • USLT:Unsychronizedlyric/text tranion
  • WCOM:Commercialinformation
  • WCOP:Copyright/Legalinformation
  • WOAF:Officialaudio file webpage
  • WOAR:Officialartist/performer webpage
  • WOAS:Officialaudio source webpage
  • WORS:Officialinternet radio station homepage
  • WPAY:Payment
  • WPUB:Publishersofficial webpage
  • WXXX:UserdefinedURL link

音乐类型

  • 0=“Blues”;
  • 1=“ClassicRock”;
  • 2=“Country”;
  • 3=“Dance”;
  • 4=“Disco”;
  • 5=“Funk”;
  • 6=“Grunge”;
  • 7=“Hip-Hop”;
  • 8=“Jazz”;
  • 9=“Metal”;
  • 10=“NewAge”;
  • 11=“Oldies”;
  • 12=“Other”;
  • 13=“Pop”;
  • 14=“R&B”;
  • 15=“Rap”;
  • 16=“Reggae”;
  • 17=“Rock”;
  • 18=“Techno”;
  • 19=“Industrial”;
  • 20=“Alternative”;
  • 21=“Ska”;
  • 22=“Deathl”;
  • 23=“Pranks”;
  • 24=“Soundtrack”;
  • 25=“Euro-Techno”;
  • 26=“Ambient”;
  • 27=“Trip-Hop”;
  • 28=“Vocal”;
  • 29=“Jazz+Funk”;
  • 30=“Fusion”;
  • 31=“Trance”;
  • 32=“Classical”;
  • 33=“Instrumental”;
  • 34=“Acid”;
  • 35=“House”;
  • 36=“Game”;
  • 37=“SoundClip”;
  • 38=“Gospel”;
  • 39=“Noise”;
  • 40=“AlternRock”;
  • 41=“Bass”;
  • 42=“Soul”;
  • 43=“Punk”;
  • 44=“Space”;
  • 45=“Meditative”;
  • 46=“InstrumentalPop”;
  • 47=“InstrumentalRock”;
  • 48=“Ethnic”;
  • 49=“Gothic”;
  • 50=“Darkwave”;
  • 51=“Techno-Industrial”;
  • 52=“Electronic”;
  • 53=“Pop-Folk”;
  • 54=“Eurodance”;
  • 55=“Dream”;
  • 56=“SouthernRock”;
  • 57=“Comedy”;
  • 58=“Cult”;
  • 59=“Gangsta”;
  • 60=“Top40”;
  • 61=“ChristianRap”;
  • 62=“Pop/Funk”;
  • 63=“Jungle”;
  • 64=“NativeAmerican”;
  • 65=“Cabaret”;
  • 66=“NewWave”;
  • 67=“Psychadelic”;
  • 68=“Rave”;
  • 69=“Showtunes”;
  • 70=“Trailer”;
  • 71=“Lo-Fi”;
  • 72=“Tribal”;
  • 73=“AcidPunk”;
  • 74=“AcidJazz”;
  • 75=“Polka”;
  • 76=“Retro”;
  • 77=“Musical”;
  • 78=“Rock&Roll”;
  • 79=“HardRock”;
  • 80=“Folk”;
  • 81=“Folk-Rock”;
  • 82=“NationalFolk”;
  • 83=“Swing”;
  • 84=“FastFusion”;
  • 85=“Bebob”;
  • 86=“Latin”;
  • 87=“Revival”;
  • 88=“Celtic”;
  • 89=“Bluegrass”;
  • 90=“Avantgarde”;
  • 91=“GothicRock”;
  • 92=“ProgessiveRock”;
  • 93=“PsychedelicRock”;
  • 94=“SymphonicRock”;
  • 95=“SlowRock”;
  • 96=“BigBand”;
  • 97=“Chorus”;
  • 98=“EasyListening”;
  • 99=“Acoustic”;
  • 100=“Humour”;
  • 101=“Speech”;
  • 102=“Chanson”;
  • 103=“Opera”;
  • 104=“ChamberMusic”;
  • 105=“Sonata”;
  • 106=“Symphony”;
  • 107=“BootyBass”;
  • 108=“Primus”;
  • 109=“PornGroove”;
  • 110=“Satire”;
  • 111=“SlowJam”;
  • 112=“Club”;
  • 113=“Tango”;
  • 114=“Samba”;
  • 115=“Folklore”;
  • 116=“Ballad”;
  • 117=“PowerBallad”;
  • 118=“RhythmicSoul”;
  • 119=“Freestyle”;
  • 120=“Duet”;
  • 121=“PunkRock”;
  • 122=“DrumSolo”;
  • 123=“Acapella”;
  • 124=“Euro-House”;
  • 125=“DanceHall”;
  • 126=“Goa”;
  • 127=“Drum&Bass”;
  • 128=“Club-House”;
  • 129=“Hardcore”;
  • 130=“Terror”;
  • 131=“Indie”;
  • 132=“BritPop”;
  • 133=“Negerpunk”;
  • 134=“PolskPunk”;
  • 135=“Beat”;
  • 136=“ChristianGangstaRap”;
  • 137=“Heavyl”;
  • 138=“Blackl”;
  • 139=“Crossover”;
  • 140=“ContemporaryChristian”;
  • 141=“ChristianRock”;
  • 142=“Merengue”;
  • 143=“Salsa”;
  • 144=“Trashl”;
  • 145=“Anime”;
  • 146=“JPop”;
  • 147=“Synthpop”;

参考

  • MPEG简介+如何计算CBR/VBR MP3的播放时间-1
  • MPEG简介 + 如何计算CBR/VBR MP3的播放时间 - 2
  • MPEG简介 + 如何计算CBR/VBR MP3的播放时间 - 3
  • MPEG简介 + 如何计算CBR/VBR MP3的播放时间 - 4
  • MPEG简介 + 如何计算CBR和VBR的MP3的播放时间 v1.5
  • Mp3格式总结
  • MP3文件结构解析(超详细)
  • MP3编码分析
  • (官网)ISO/IEC 11172-1:1993(en)Information technology — Coding of moving pictures and associated audio for digital storage media at up to about 1,5 Mbit/s — Part 1: Systems
  • (官网)ISO/IEC 11172-3:1993(en)
    Information technology — Coding of moving pictures and associated audio for digital storage media at up to about 1,5 Mbit/s — Part 3: Audio
  • (ietf)The audio/mpeg Media Type
  • (wikipedia)MP3
  • (fileformat)MP3
  • (官网)ID3 tag version 2.4.0 - Main Structure
  • (官网)ID3 tag version 2.3.0
  • (官网)ID3 tag version 2.2.0
  • github ParseMp3tag

下篇 Mp3文件结构全解析(二)接着分析MP3文件的音频内容解析
示例代码地址:git@github.com:qingkouwei/mp3parser.git
*如果对你有帮助的话点个赞吧!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1837533.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring事务 和 事务传播机制

这里的 事务 和之前 MySQL的事务 一样&#xff0c;都是表示将⼀组操作封装成⼀个执⾏单元&#xff08;封装到⼀起&#xff09;&#xff0c;要么全部成功&#xff0c;要么全部失败。 Spring 中事务的实现 1. 编程式事务&#xff08;手动档&#xff09;。 package com.example.…

图论之岛屿系列

图论之岛屿系列 形成模板进行学习&#xff0c;加快学习效率 深度优先遍历 # 可以直接改原始grid的采用直接改的方案来完成修改&#xff0c;减少了内存开支 def dfs(self, grid, i, j):if i < 0 or j < 0 or i > len(grid) or j > len(grid[0]) or grid[i][j] &…

无引擎底层游戏开发(1):EasyX图形库引入 + 跟随鼠标移动的小球

来自bilibili up主的Voidmatrix的视频教程&#xff1a;【从零开始的C游戏开发】 一、图形库引入 EasyX在国内文档最多&#xff0c;而且功能函数齐全&#xff0c;最适合入门。 环境配置&#xff1a;vs2022 &#xff08;官网下载免费版&#xff09; 百度搜EasyX官方&#xff0…

AI搜索工具,提升你的工作效率

当我们需要查询某个内容的时候&#xff0c;除了可以通过搜索引擎来查找&#xff0c;还可以通过AI搜索工具来查找。AI搜索工具会智能的从网络信息中查找答案并整理后给我们结果。除了搜索结果&#xff0c;AI搜索工具还可以用来帮我们创作内容&#xff0c;比如你需要写一篇文章&a…

【博弈】843. 猜猜这个单词

本题涉及知识点 博弈 LeetCode843. 猜猜这个单词 给你一个由 不同 字符串组成的单词列表 words &#xff0c;其中 words[i] 长度均为 6 。words 中的一个单词将被选作秘密单词 secret 。 另给你一个辅助对象 Master &#xff0c;你可以调用 Master.guess(word) 来猜单词&…

Harbor本地仓库搭建003_Harbor常见错误解决_以及各功能使用介绍_镜像推送和拉取---分布式云原生部署架构搭建003

首先我们去登录一下harbor,但是可以看到,用户名密码没有错,但是登录不上去 是因为,我们用了负债均衡,nginx会把,负载均衡进行,随机分配,访问的 是harbora,还是harborb机器. loadbalancer中 解决方案,去loadbalance那个机器中,然后 这里就是25机器,我们登录25机器 然后去配置…

CentOS 7x 使用Docker 安装oracle11g完整方法

1.安装docker-ce 安装依赖的软件包 yum install -y yum-utils device-mapper-persistent-data lvm2添加Docker的阿里云yum源 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo更新软件包索引 yum makecache fast查看docker…

MacOS - command not found: brew

问题描述 command not found: brew 原因分析 没有安装 Homebrew&#xff0c;安装后即可使用~ 解决方案 打开终端&#xff0c;输入&#xff1a;/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"&#xff0c;点击回车 在弹出…

FlinkCDC介绍及使用

CDC简介 什么是CDC&#xff1f; cdc是Change Data Capture(变更数据获取)的简称。核心思想是&#xff0c;监测并捕获数据库的 变动(包括数据或数据表的插入&#xff0c;更新以及删除等)&#xff0c;将这些变更按发生的顺序完整记录下来&#xff0c;写入到消息中间件以供其它服…

归并排序 (递归实+非递归)

前言 归并排序是一种逻辑很简单&#xff0c;但是实现有点难度的排序&#xff0c;尤其是非递归&#xff0c;对于区间的把握更是需要一点逻辑的推导&#xff0c;但是没有关系&#xff0c;轻松拿捏 归并排序gif 归并排序单趟实现 1&#xff0c;创建tmp数组&#xff0c; 2&#xff…

《Windows API每日一练》4.6 矩形、区域和裁剪

在前面的4.3节中我们讲述了绘制矩形的API函数Rectangle和RoundRect。本节我们将介绍另外一组使用RECT矩形结构和区域的绘图函数。 本节必须掌握的知识点&#xff1a; 矩形 第28练&#xff1a;绘制随机矩形 矩形与区域的裁剪 第29练&#xff1a;区域裁剪 4.6.1 矩形 ■FillRe…

HarmonyOS开发知识 :扩展修饰器,实现节流、防抖、权限申请

引言 防重复点击&#xff0c;利用装饰器面向切面&#xff08;AOP&#xff09;的特性结合闭包&#xff0c;实现节流、防抖和封装权限申请。 节流 节流是忽略操作&#xff0c;在触发事件时&#xff0c;立即执行目标操作&#xff0c;如果在指定的时间区间内再次触发了事件&…

C语言中的内存动态管理

1.为什么有动态内存管理 int a20;//开辟4个字节 int arr[10]{0};//开辟40个字节 上述的代码有两个特点 1.开辟空间的大小是固定的。 2.数组在申明的时候已经固定了大小&#xff0c;无法更改。 这样写代码不够灵活&#xff0c;所以c语言中引入了动态内存管理&#xff0c;让程序…

Java | Leetcode Java题解之第165题比较版本号

题目&#xff1a; 题解&#xff1a; class Solution {public int compareVersion(String version1, String version2) {int n version1.length(), m version2.length();int i 0, j 0;while (i < n || j < m) {int x 0;for (; i < n && version1.charAt(…

Flat Ads:全球领先的移动广告营销平台

Flat Ads是全球领先的移动广告营销平台,凭借独家开发者矩阵网络和程序化广告交易平台,帮助广告主在全球范围内精准获取目标用户,提升品牌知名度,实现业务增长目标。同时,Flat Ads也致力于为全球开发者提供高效变现、最大化收益的一站式解决方案,助力开发者实现商业价值最大化。…

怎么给软件做数字证书签名?

要想让软件获得身份并让计算机识别软件发布者就需要申请数字证书&#xff0c;CA机构严格实名认证后签发的数字证书就可以对指定的软件签名使用。 代码签名是使用数字证书对软件、固件、脚本和可执行文件进行签名的过程&#xff0c;旨在向最终用户和客户保证代码的完整性和真实…

【论文阅读】-- Attribute-Aware RBFs:使用 RT Core 范围查询交互式可视化时间序列颗粒体积

Attribute-Aware RBFs: Interactive Visualization of Time Series Particle Volumes Using RT Core Range Queries 1 引言2 相关工作2.1 粒子体渲染2.2 RT核心方法 3 渲染彩色时间序列粒子体积3.1 场重构3.1.1 密度场 Φ3.1.2 属性字段 θ3.1.3 优化场重建 3.2 树结构构建与调…

最新ios苹果手机版植物大战僵尸杂交版下载安装2024六月最新

嘿&#xff0c;亲爱的小可爱们~ &#x1f31f; 今天给你们带来一款超炫的游戏——植物大战僵尸杂交版2024&#xff01;这可不是普通的植物大战僵尸哦&#xff0c;它融合了最新的科技元素和创新玩法&#xff0c;让你在打僵尸的战场上大呼过瘾。快跟着我一起探索这个神奇的游戏世…

在PHP项目中使用阿里云消息队列MQ集成RabbitMQ的完整指南与问题解决

在现代Web应用程序中&#xff0c;消息队列系统扮演着至关重要的角色&#xff0c;帮助开发者实现异步处理、削峰填谷、任务调度等功能。阿里云消息队列MQ作为一种高可用、可伸缩的消息队列服务&#xff0c;为开发者提供了可靠的消息投递和处理能力。而RabbitMQ则是一种广泛使用的…

yolov9-pytorch 深度学习目标检测算法模型

YOLOv9 论文 https://arxiv.org/abs/2402.13616 模型结构 YOLOv9将可编程梯度信息 (PGI) 概念与通用 ELAN (GELAN)架构相结合而开发&#xff0c;代表了准确性、速度和效率方面的重大飞跃。 算法原理 Yolov9将可编程梯度信息&#xff08;PGI&#xff09;和GLEAN&#xff08…