Invece del sovraccarico con saving binary as Base64, mi chiedevo se fosse possibile archiviare direttamente flussi binari a doppio byte in file XML, utilizzando CDATA o commentando o qualcosa del genere?Utilizzare CDATA per memorizzare flussi binari non elaborati?
risposta
È possibile memorizzarlo come CDATA, ma esiste il rischio che alcune sequenze di byte vengano valutate in XML valido che chiude la sezione CDATA. Dopo una rapida occhiata a http://www.w3.org/TR/2006/REC-xml-20060816/#sec-cdata-sect, sembra che tu possa avere qualsiasi sequenza di caratteri eccetto "]]>". Dai un'occhiata anche allo what is a valid XML char.
Il carattere Nul ('\ 0' in C) non è valido da nessuna parte in XML, nemmeno come escape (& # 0;).
Suppongo che i file XML abbiano una terminazione null. –
@Jeremy: Non lo sono. Null non è un carattere XML valido, probabilmente a causa di stringhe con terminazione null in un linguaggio di programmazione popolare ... – Christoph
Nota che lo standard non è del tutto chiaro al 100%.Le definizioni dell'intervallo di caratteri escludono il byte 0 ma alcuni altri testi dicono che qualsiasi carattere sotto 127 è valido. –
XML è un formato di testo semplice: non utilizzarlo per memorizzare dati binari. Inserisci i blob binari in file separati e aggiungi un elemento al tuo XML che fa riferimento a questi file. Se si desidera archiviare tutti i blob binari in un singolo file, aggiungere un attributo offset o qualcosa del genere ...
Sì, e esattamente in che modo si suppone che Flash si connetta e legga i file binari non formattati? (Solo ActionScript 2) –
Non fornirmi la conversazione ByteArray o URLLoader. Questo è solo AS2. –
@Jeremy: e dove lo hai detto esattamente nella tua domanda? – Christoph
No, non è possibile utilizzare CDATA da solo per iniettare dati binari in un file XML.
In XML1.0 (perché XML 1.1 è più permissiva, ma non si tratta di caratteri di controllo), le seguenti restrizioni si applicano a personaggi CDATA:
CData ::= (Char* - (Char* ']]>' Char*))
Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
Ciò significa che ci sono diversi personaggi illegali, tra i quali sono:
- caratteri di controllo XML illegali 0x00 a 0x20 eccezione nuove linee, i ritorni a capo e tabulazioni
- illegali UTF-8 sequenze come 0xFF o la non canonica 0b1100000x 0b10xxxxxx 012.
In aggiunta a ciò, in un contenuto un'entità standard senza CDATA:
- "<" e ">" l'uso sono illegali
- "&" uso è limitato (
é
è OK,&zajdalkdza;
è non)
Così CDATA è solo un modo per consentire "<", ">" e "&", limitando "]]>" invece. Non risolve il problema dei caratteri XML, Unicode e UTF-8 illegali, che è il problema principale.
Solutions:
- Utilizzare Base64 con il 33% in testa, ma un grande supporto in tutte le lingue di programmazione e il fatto che si tratta di uno standard
- Usa BaseXML con le implementazioni ancora limitate ma il 20% in testa solo
- Non codificare i dati binari all'interno di XML, se possibile, trasferirlo separatamente
- 1. Utilizzo di Stream.Read() vs BinaryReader.Read() per elaborare flussi binari
- 2. Ci sono flussi di memoria binari in C++
- 3. Tipi e prestazioni non elaborati
- 4. Utilizzo di CDATA in un altro CDATA
- 5. Byte PCM non elaborati [] Per l'audio su Android
- 6. Come utilizzare Golang per comporre pacchetti TCP non elaborati (usando gopacket) e inviarli tramite socket raw
- 7. Come modellare e memorizzare le attività ricorrenti nei binari?
- 8. Vuoi memorizzare dati binari nel database o nel file system?
- 9. Sta iniziando a utilizzare CDATA un cambiamento sostanziale?
- 10. Mongo 3.0.6 ripristina file WT non elaborati
- 11. Come memorizzare le versioni/i binari in GitLab?
- 12. Accesso ai dati di contatto non elaborati
- 13. Best practice per la memorizzazione di flussi di dati costanti
- 14. Memorizzazione di stringhe lunghe binarie (dati non elaborati)
- 15. non introducendo CDATA con un solo valore
- 16. PHP APC Per memorizzare o non memorizzare nella cache?
- 17. Grails \ Hibernate: per memorizzare o non memorizzare nella cache?
- 18. E4X Aggiungi contenuto CDATA
- 19. Codifica CDATA XML
- 20. Come analizzare XML per <![CDATA[]]>
- 21. Utilizzo $ _SESSION per memorizzare/memorizzare query MySQL
- 22. Decode CDATA in C#
- 23. Utilizzando NSXMLParser con CDATA
- 24. JavaScript può caricare byte non elaborati da utilizzare in Canvas HTML5?
- 25. Cacao: AVAsset da dati non elaborati (ad esempio NSData)
- 26. Genera PDF da ASP.NET da contenuti HTML/CSS non elaborati?
- 27. Utilizzare una Hashtable per memorizzare solo le chiavi?
- 28. contenuti Estrazione da <![CDATA []]>
- 29. Come utilizzare la registrazione attiva senza binari
- 30. Come utilizzare il buffer di profondità per memorizzare gli indici
Non significa no, non è possibile, poiché 0-8, B, C, E, F FFFE e FFFF sono caratteri non validi? –
Downvoting perché ci sono molte sequenze di byte che non verranno conservate. Con "non preservare", intendo che non è possibile recuperare i dati binari originali dai dati codificati con CDATA. Vedi la risposta e i commenti di Pete. – rwong
è molto più rischioso di quanto suggerisci qui. Vedi la risposta di pete ... – Phil