Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    338

    c# - scrivere file di char

    ciao a tutti,
    ho un problemone da risolvere in merito alla scrittura di un file.
    Devo creare un file che contenga dei numeri da 0 a 999 scritti ognuno su 2 byte con il primo più significativo, cioè:
    1 = 00 01
    220 = 00 DC
    eccetera

    Il problema è che non sono assolutamente riuscito, ho provato ad usare uno streamwriter ( e prima un binarywriter ) ma non ottengo assolutamente gli stessi dati, anzi numeri che non mi spiego.
    Se apro il file destinazione in notepad++ devo vedere formato=ansi e convertendolo in hex-16 i valori scritti come spiegato sopra.

    Qualcosa di sensato lo ottengo in memoria se faccio una codifica specificando
    codice:
    UnicodeEncoding enc = new UnicodeEncoding(true, false);
    enc.GetBytes(c);
    ottenendo: byte[4] = 0 / 1 / 0 / 220

    però se scrivo sul file tutto mi perde di significato:
    "000000000 53 79 73 74 65 6D 2E 42-79 74 65 5B 5D 01 C3 9C |System.Byte[]Ü|"

    Avete delle idee?
    grazie

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Usa il binarywrite ... il dato di partenza di che tipo è?
    Quale codice avevi scritto ?

    Come mai il primo deve essere il più significativo?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    338
    codice attuale:

    codice:
    FileStream fs = new FileStream(@"c:\test.prg", FileMode.Create, FileAccess.Write, FileShare.None);
    
                UInt16 ui1 = 1;
                char ch1 = Convert.ToChar(ui1);
                UInt16 ui2 = 220;
                char ch2 = Convert.ToChar(ui2);
                UnicodeEncoding enc = new UnicodeEncoding(true, false);
                char[] c = new char[2];
                c[0] = ch1;
                c[1] = ch2;
    
                using (StreamWriter sw = new StreamWriter(fs))
                {
                    sw.Write(enc.GetBytes(c));
                    sw.Write(c);
                }
    il binarywrite dove lo metteresti?
    il dato di partenza è una lista di numeri da 0 a 999, il primo più significativo lo desumo analizzando un file di esempio che ha i dati scritti nel modo specificato.
    Io sto facendo una applicazione che scriva file in questo formato e che poi devono essere letti da un sw esterno.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Semplicemente

    codice:
                FileStream fs = new FileStream(@"c:\test.prg", FileMode.Create);
                BinaryWriter w = new BinaryWriter(fs);
    
                UInt16 ui2 = 220;
                w.Write(ui2);
    
                w.Close();
                fs.Close();
    ma la scrittura avviene nell'ordine L H quindi

    DC 00

    Probabilmente interpreti male il file di esempio.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    338
    guarda allego il file modello così vedi anche tu, non mi sembra di aver sbagliato.

    http://www.eelle.net/varie/modello.prg

    x la scrittura:
    1 - l'ordine in ogni caso non è possibile stabilirlo? l'encoding non serve anche a quello?
    2 - anche invertendo i dati non mi tornano

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Non ho capito ... da quel file non puoi stabilire nulla se non ne conosci la struttura.

    Se lo leggi ci sono dei byte com

    00 DC 00

    e non puoi sapere se il valore che ti serve è

    00 DC

    oppure

    DC 00

    Non so da dove ti arrivi quel file (di cosa si tratta) ma l'ordine dovrebbe essere L H
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    338
    io la struttura la conosco. in sostanza io devo scrivere i seguenti valori

    0,1,110,8,0,0,0,0,1,1

    che corrispondono ai primi byte del file che ho linkato, che convertito con notepad++ da text a hex16 (textFx) risulta:

    00 00 00 01 00 6E 00 08 00 00 00 00 00 00 00 00 00 01 00 01

    per il primo blocco

    e son scritti HL

    ---

    con

    codice:
    using (BinaryWriter bw = new BinaryWriter(fs))
    {
        bw.Write(c);
    }
    ottengo 01 C3 9C, che nn mi dice nulla

    ---
    attenzione: così

    codice:
    using (BinaryWriter bw = new BinaryWriter(fs))
    {
        bw.Write(enc.GetBytes(c));
    }
    ottengo 00 01 00 DC
    forse ci siamo!

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ok ... quindi ti basta un metodo come questo

    codice:
    public static UInt16 SwapLH(UInt16 v)
    {
        return (UInt16)(((v >> 8) & 0x00FF) | ((v << 8) & 0xFF00));
    }
    che chiamerai con

    codice:
        w.Write(SwapLH(ui2));
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    338
    grazie ma..non ho capito xchè dovrei usare quel metodo invece del codice ultimo che ho postato.. mi sembrano già nell'ordine giusto i dati, cioè HL

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da Another
    grazie ma..non ho capito xchè dovrei usare quel metodo invece del codice ultimo che ho postato.. mi sembrano già nell'ordine giusto i dati, cioè HL
    Cioè tutto quello che parte dall'UInt16 e passa attraverso il Convert.ToChar, l'UnicodeEncoding, il vettore di char e il GetByte ... secondo te è più semplice della funzioncina che ti ho proposto ?

    Beh ... scegli tu ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.