![]() |
Datenbank: SQLite • Version: 3.8.5 • Zugriff über: TSQLiteDatabase
Sounddatei als Blob in SQLite
Moin Moin ...
In einer SQLite Tabelle wurden *.m4a Dateien in Blob-Felder gepackt. Diese möchte ich auslesen und abspielen. Erwartet hatte ich ein Ergebnis in dieser Art: (HEX-Auszug des Headers)
Code:
Jedoch sieht die Datei nach dem Speichern leider so aus und ist demnach dann auch nicht direkt abspielbar.
00 00 00 1C 66 74 79 70 4D 34 41 20 00 00 00 00 ....ftypM4A ....
4D 34 41 20 6D 70 34 32 69 73 6F 6D 00 00 00 08 M4A mp42isom....
Code:
Die Daten lese ich ungefähr folgendermaßen aus:
00 00 00 00 00 00 00 1C 00 66 00 74 00 79 00 70 .........f.t.y.p
00 4D 00 34 00 41 00 20 00 00 00 00 00 00 00 00 .M.4.A. ........ 00 4D 00 34 00 41 00 20 00 6D 00 70 00 34 00 32 .M.4.A. .m.p.4.2
Code:
Die auskommentierten Stellen zeigen einen Versuch nur jede zweite Zahl zu nehmen, aber das funktioniert leider auch nicht, weil über die gesamte Datei gesehen eben nicht nur Nullen vor jeder Zahl stehen, sondern auch ab und zu mal ein $FF oder $04 oder eine $06 übersprungen wird. Warscheinlich ist die Lösung ganz einfach, aber ich komme hier nicht weiter. Danke schon mal für Eure Hilfe.
var Blob: TSQLiteBlobStream; ms: TStringStream; b: Byte;
ms := TStringStream.Create(''); if Blob.Size > 0 then begin ms.Position := 0; ms.CopyFrom(Blob, Blob.Size); // with Blob do // while Position < Pred(Size) do begin // Read(b, 1); // if Odd(Position) then ms.WriteBuffer((b), 1); // end; ^^ tut es leider auch nicht ... Unicode, UTF8 ? Blob.Free; ms.Position := 0; ms.SaveToFile('Test.m4a'); end; Total verHEXt grüßt ... |
AW: Sounddatei als Blob in SQLite
Das sieht sehr nach Unicode aus.
|
AW: Sounddatei als Blob in SQLite
Das dachte ich mir auch schon, als ich gemerkt hatte, das nicht einfach in jeder zweiten Zahl "die Musik spielt" :-D (starkes Wortspiel, oder?) Wie genau bringe ich die Daten dann wieder in seine ursprüngliche Form zurück?
|
AW: Sounddatei als Blob in SQLite
Nimm mal einen MemoryStream und schau wie die Daten da kommen.
|
AW: Sounddatei als Blob in SQLite
Danke schon mal für die Antwort. Naja, wenn ich das von TStringStream auf TMemoryStream ändere, dann sieht das erstmal genau gleich aus. Die Frage bleibt jedoch, wie ich das jetzt sinnvoll konvertiere. Bei StringStream habe ich auch schon mit sämtlichen Version von
Code:
herum gespielt, was aber auch nicht den gewünschten Effekt brachte. Gibt es denn da keine System-Routine welche ich auf diesen Datenstrom anwenden könnte?
TStringStream.Create('', TEncoding.WasAuchImmer);
|
AW: Sounddatei als Blob in SQLite
Da würde ich mal sagen, da hat jemand ganze Arbeit geleistet und die binären Daten als string eingelesen (natürlich Unicode -> UTF16 -> 2 Bytes pro Zeichen) und dann in die Datenbank geschrieben.
Respekt ... da wusste einer aber ganz genau Bescheid, was er da tut :roll: Dir ist schon bewusst, um was für eine Codierung es sich handelt?
Delphi-Quellcode:
.
TEncoding.BigEndianUnicode
Kleines Beispiel:
Delphi-Quellcode:
program dp_182745;
{$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; procedure OutputBytes( ABytes: TBytes ); var LIdx: Integer; begin for LIdx := Low( ABytes ) to High( ABytes ) do Write( Format( '%2.2x ', [ABytes[LIdx]] ) ); WriteLn; end; procedure Sample; var LData: TBytes; LDataStr: string; begin LData := TBytes.Create( $00, $00, $00, $00, $00, $00, $00, $1C, $00, $66, $00, $74, $00, $79, $00, $70, $00, $4D, $00, $34, $00, $41, $00, $20 ); OutputBytes( LData ); LDataStr := TEncoding.BigEndianUnicode.GetString( LData ); LData := TEncoding.ANSI.GetBytes( LDataStr ); OutputBytes( LData ); end; begin try Sample; except on E: Exception do WriteLn( E.ClassName, ': ', E.Message ); end; ReadLn; end. |
AW: Sounddatei als Blob in SQLite
Hallo
Ich habe ein ähnliches PRoblem: Ich habe eine SQLITE DB wo ID in Table REF und Location und ReferenceID in Table LOcation BLOB sind. (sind eigl. GUID in binärer Form, da das Devat Unidac die OPtion Binary GUID = False nicht hat muß ich so herumwurschtln) Jetzt möchte ich in Location einen Record in Location mit random ID und einen von REF herausgelesenen GUID eintragen (insert) Doch ich komm nicht weiter... vielleicht muss es doch viel einfacher gehen BIn für jeden RAT DANKBAR! Ich dachte mir so:
Delphi-Quellcode:
so hab ich es auch probiert: Immer ungültige Typenumwandlung bei der 1. zeil
procedure TForm1.Button3Click(Sender: TObject);
var blobID, blobRefID: system.Classes.TStream; MyStreamID: TMemoryStream; MyGuid0: TGUID; sISBN,oldURL: string; sLINK: string; nRECNUM: integer; k: Integer; begin nRecnum:=0; while not(uniquery1.Eof) do begin nRecNUm:=nrECNUm+1; sISBN:=Uniquery1.FieldByName('ISBN').AsString; if getlinefromMemo(sISBN) then begin label4.Caption:=Format('LINKs found: %d @ RecNr.: %d',[listbox1.Count,Nrecnum]); for k := 0 to listbox1.Count-1 do begin MyStreamID := TMemoryStream.Create; if UniConnection1.ProviderName='SQLite' then begin (* // INsert into location in Citavi DB > insert into Location (ID,Address,ReferenceID,CreatedOn,ModifiedOn,AddressInfo,LocationType,PreviewBehaviour) > ( > :MyRANDGUID, > :FILENAME, > :RefID, > datetime(strftime('%s','now'), 'unixepoch', 'localtime'), > datetime(strftime('%s','now'), 'unixepoch', 'localtime'), > 1, > 0, > 0); *) blobID := UniQuery1.CreateBlobStream(UniQuery1.FieldByName('ID'), bmRead); // HIER HAPPERTS. MyStreamID.Clear; MyStreamID.LoadFromStream(blobID ); uniquery2.ParamByName('RefID').LoadFromStream(MyStreamID, ftBlob); CreateGUID(MyGuid0); uniquery2.ParamByName('MyRandGUID').AsBlob:=TEncoding.UTF8.GetBytes(GUIDToString(MyGuid0)); Label5.Caption:=Format('DB Record GUID: %s : %s',[uniquery1.FieldByName('MYID').AsString,uniquery1.FieldByName('ID').AsString]); end else begin uniquery2.SQL.Text:=' Update refs set URL = :Filename where id = :RefID'; if not(checkbox3.Checked) then uniquery2.SQL.Text:=' Update refs set link_to_pdf = :Filename where id = :RefID'; uniquery2.ParamByName('RefID').AsString:=uniquery1.FieldByName('id').AsString; end; if (UniConnection1.ProviderName='MySQL') then begin if not(checkbox3.Checked) then oldURL:=uniquery1.FieldByName('link_to_pdf').AsString else oldURL:=uniquery1.FieldByName('url').AsString; end; if trim(oldURL) = '' then uniquery2.ParamByName('Filename').AsString:=convertfn(listbox1.Items[k]) else uniquery2.ParamByName('Filename').AsString:=oldURL+#13#10+convertfn(listbox1.Items[k]) ; uniquery2.Execute; MyStreamID.Free; WriteLOgMemo(Format('UPD: ISBN: %s -> Affected Rows: %d',[sISBN,uniquery2.RowsAffected])); end; Application.ProcessMessages; end; uniquery1.Next; end; WriteLOgMemo(Format('UPDATE with URLs finished: Total affected Rows: %d',[nrecnum])); end;
Delphi-Quellcode:
blobID := UniQuery1.FieldByName('ID') as TBlobField;
BlobID.LoadFromStream(MyStreamID); TBlobField(UniQuery2.FieldByName('RefID')).LoadFromStream(MyStreamID); CreateGUID(MyGuid0); uniquery2.ParamByName('MyRandGUID').AsBlob:=TEncoding.UTF8.GetBytes(GUIDToString(MyGuid0)); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz