Domanda

Qualche giorno fa, ho chiesto a perché non è possibile memorizzare dati binari , ad esempio un file jpg in una variabile stringa .

La maggior parte delle risposte che ho ricevuto ha detto che la stringa viene utilizzata per informazioni testuali come quello che sto scrivendo ora.

Quali sono tuttavia i dati testuali? I byte di una certa natura rappresentano un file jpg e quei byte potrebbero essere rappresentati dai valori dei byte di caratteri ... Penso. Quindi quando diciamo che le stringhe sono per informazioni testuali, esiste una sorta di intervallo o elenco di caratteri che non sono memorizzati?

Scusa se la domanda sembra sciocca. Sto solo cercando di "scaricarlo"

È stato utile?

Soluzione

Vedo tre problemi principali con la memorizzazione dei dati binari nelle stringhe:

  1. La maggior parte dei sistemi assume una certa codifica all'interno delle variabili stringa - ad es. se è una stringa UTF-8, UTF-16 o ASCII. I caratteri di nuova riga possono anche essere tradotti a seconda del sistema in uso.
  2. Dovresti fare attenzione alle restrizioni sulla dimensione delle stringhe.
  3. Se si utilizzano stringhe di stile C, ogni carattere null nei dati terminerà la stringa e qualsiasi operazione di stringa eseguita funzionerà solo sui byte fino al primo null.
  4. Forse il più importante: è confuso - altri sviluppatori non si aspettano di trovare dati binari casuali nelle variabili stringa. E molto codice che funziona sulle stringhe potrebbe anche essere molto confuso quando si incontrano dati binari :)

Altri suggerimenti

Preferirei archiviare i dati binari come binari, penseresti di convertirli in testo solo quando non c'è altra scelta, poiché quando li converti in una rappresentazione testuale si sprecano alcuni byte (non molto, ma conta comunque) , è così che inseriscono gli allegati nelle email.

Base64 è una buona rappresentazione testuale di file binari.

Penso che ti riferisci a problema di codifica binaria e di testo . (tradurre un jpg in una stringa richiederebbe quel tipo di pre-elaborazione)

In effetti, in quell'articolo, alcuni personaggi sono citati come non sempre supportati, altri possono essere fonte di confusione:

  

Alcuni sistemi hanno un set di caratteri più limitato che possono gestire; non solo non sono puliti a 8 bit, alcuni non riescono nemmeno a gestire tutti i caratteri ASCII stampabili.
  Altri hanno limiti al numero di caratteri che possono apparire tra le interruzioni di riga.
  Altri ancora aggiungono intestazioni o trailer al testo.

     

E alcuni protocolli poco considerati ma ancora usati usano la segnalazione in banda, creando confusione se nel messaggio compaiono schemi specifici. La più nota è la stringa " From " (incluso lo spazio finale) all'inizio di una riga utilizzata per separare i messaggi di posta nel formato file mbox.

Chiunque ti abbia detto che non puoi inserire dati "binari" in una stringa ha sbagliato. Una stringa rappresenta semplicemente una matrice di byte che molto probabilmente prevedi di utilizzare per i dati testuali ... ma non c'è nulla che ti impedisca di inserire tutti i dati che desideri.

Devo stare attento però, perché non so quale lingua stai usando ... e in alcune lingue \ 0 termina la stringa.

In C #, puoi inserire qualsiasi dato in una stringa ... esempio:

byte[] myJpegByteArray = GetBytesFromSomeImage();

string myString = Encoding.ASCII.GetString(myJpegByteArray);

Prima dell'internazionalizzazione, non faceva molta differenza. I caratteri ASCII sono tutti byte, quindi stringhe, array di caratteri e array di byte hanno finito con la stessa implementazione.

In questi giorni, tuttavia, le stringhe sono molto più complicate, al fine di gestire migliaia di caratteri in lingua straniera e le regole linguistiche che li accompagnano.

Certo, se guardi abbastanza in profondità, tutto è solo bit e byte, ma c'è un mondo di differenza nel modo in cui il computer li interpreta. Le regole per " testo " fa sembrare le cose giuste quando viene mostrato a un essere umano, ma il computer è libero di usare la rappresentazione interna. Ad esempio,

In fondo tutto è solo byte. Cose come stringhe e immagini sono definite da regole su come ordinare i byte. le stringhe, ad esempio, finiscono in un byte con valore 32 (o qualcos'altro) jpg non lo fa

Dipende dalla lingua. Ad esempio in Python i tipi di stringa (str) sono in realtà array di byte, quindi possono essere effettivamente utilizzati per i dati binari.

In C il byte NULL viene utilizzato per la terminazione della stringa, quindi una puntura non può essere utilizzata per dati binari arbitrari, poiché i dati binari potrebbero contenere byte null.

In C # una stringa è un array di caratteri, e poiché un carattere è sostanzialmente un alias per int a 16 bit, è probabile che tu possa scappare con la memorizzazione di dati binari arbitrari in una stringa. Potresti ricevere errori quando provi a visualizzare la stringa (perché alcuni valori potrebbero non corrispondere effettivamente a un carattere Unicode legale) e alcune operazioni come le conversioni di casi probabilmente falliranno in modo strano.

In breve, in alcuni linguaggi potrebbe essere possibile archiviare dati binari arbitrari in stringhe, ma non sono progettati per questo uso e si potrebbero riscontrare problemi di qualsiasi tipo. La maggior parte delle lingue ha un tipo di array di byte per la memorizzazione di dati binari arbitrari.

Sono d'accordo con Jacobus ' risposta: Alla fine tutte le strutture dati sono costituite da byte. (Beh, se vai ancora più in profondità: di bit). Con una certa astrazione, potresti dire che una stringa o un array di byte sono convenzioni per i programmatori, su come accedervi.

A questo proposito, la stringa è un'astrazione per i dati interpretati come testo. Il testo è stato inventato per la comunicazione tra umani, computer o programmi che non comunicano molto bene usando il testo. SQL è testuale, ma è un'interfaccia per gli umani per dire a un database cosa fare.

Quindi, in generale, i dati testuali, e quindi le stringhe, sono principalmente per l'interazione da uomo a uomo o da uomo a macchina (diciamo per il contenuto di una finestra di messaggio). Usarli per qualcos'altro (ad es. Leggere o scrivere dati di immagini binarie) è possibile, ma comporta molti rischi perché si utilizza il tipo di dati per qualcosa che non è stato progettato per gestire. Questo rende molto più soggetto a errori. Potresti essere in grado di memorizzare i dati binari nelle stringhe, ma solo perché sei in grado di spararti nel piede, dovresti evitare di farlo.

Riepilogo: puoi farlo. Ma è meglio che tu non lo faccia.

La tua domanda originale ( c # - A cosa serve davvero la stringa? ) aveva poco senso. Quindi anche le risposte non avevano senso.

La tua domanda originale diceva " Per qualche ragione, quando scrivo questa stringa in un file, non si apre. " Il che non significa molto.

La tua domanda originale era incompleta e le risposte erano fuorvianti e confuse. È possibile memorizzare qualsiasi cosa in una stringa. Periodo. Le stringhe " sono per il testo " le risposte erano lì perché non hai fornito informazioni sufficienti nella tua domanda per determinare cosa non va nel tuo particolare bit di codice C #.

Non hai fornito uno snippet di codice o un messaggio di errore. Ecco perché è difficile "ottenerlo": non ci fornisci dettagli sufficienti per sapere cosa non ottieni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top