Código Delphi
[-]function GetHeaderSize(const Value: Cardinal): Cardinal;
asm
xor ecx, ecx
xchg eax, ecx
@loop: shl eax, 7
or al, cl
shr ecx, 8
jnz @loop
end;
function GetFrameSize(const Value: Cardinal): Cardinal;
asm
xchg al, ah
rol eax, 10h
xchg al, ah
end;
procedure TForm1.Button1Click(Sender: TObject);
type
TFrame = packed record
ID, Size: Cardinal;
Flags: Word;
end;
var
hFile, Size, Buffer, FrameSize, Diff, hImage: Integer;
Header: packed record
ID: array [0..2] of Char;
Version, Revision, Flags: Byte;
Size: Cardinal;
end;
Frame: ^TFrame;
Image: PChar;
begin
hFile := _lopen('Sonata ClubDelphi.mp3', OF_READ);
_lread(hFile, @Header, SizeOf(Header)); Header.Version := 0; if PCardinal(@Header)^ = $334449 then begin
Size := GetHeaderSize(Header.Size); Buffer := LocalAlloc(0, Size); Frame := Ptr(Buffer);
_lread(hFile, Frame, Size); while (Size > 0) and (Byte(Frame.ID) > 0) do
begin
FrameSize := GetFrameSize(Frame.Size); if Frame.ID = $43495041 then begin
Image := PChar(Cardinal(Frame) + SizeOf(TFrame)); Diff := lstrlen(@Image[1]) + 4; Image[6] := '.'; hImage := _lcreat(@Image[1], 0); _lwrite(hImage, @Image[Diff], FrameSize - Diff); CloseHandle(hImage); end;
Inc(FrameSize, SizeOf(TFrame)); Inc(Cardinal(Frame), FrameSize); Dec(Size, FrameSize);
end;
LocalFree(Buffer);
end;
CloseHandle(hFile);
end;
Nota; considerando que el anterior código tuvo un proposito más informativo que práctico, aconsejo usar (por ejemplo) los componentes JEDI para manejar dicha informacion.
Saludos