Caratteri e editor non stampabili

1

Oggi mi è stato presentato un problema molto sgradevole e non so bene dove chiedere questo, ma spero che sia ok.

Quindi ho la seguente stringa: ""ASCIIEncoding.Default.GetString(new byte[]{0, 1});SOH"" (almeno è così che appare in Visual Studio). Se apri lo stesso file nel blocco note ++, appare come questo: %code% . quindi sì, ho raggiunto un punto in cui ho bisogno di controllare una stringa che ha caratteri non stampabili. Il problema è che la stringa con cui sto confrontando è hardcoded e verrebbe visualizzata in questo modo:

switch (s)
{
    case "
switch (s)
{
    case "%pre%%pre%":
        Console.WriteLine("Crypto method 00");
        break;
    case "%pre%":
        Console.WriteLine("Crypto method 01");
        break;
    case "%pre%":
        Console.WriteLine("Crypto method 02");
        break;
    case "%pre%":
        Console.WriteLine("Crypto method 03");
        break;
    default:
        Console.WriteLine(s);
        break;
}
%pre%": Console.WriteLine("Crypto method 00"); break; case "%pre%": Console.WriteLine("Crypto method 01"); break; case "%pre%": Console.WriteLine("Crypto method 02"); break; case "%pre%": Console.WriteLine("Crypto method 03"); break; default: Console.WriteLine(s); break; }

codice di esempio completo può essere trovato su pastbin per il prossimo mese

Ma il codice non è importante , questo, la visualizzazione di questo codice, è orribile e questo è il problema. Non posso commettere qualcosa del genere perché nessuno saprà cosa sta succedendo.

Ovviamente potrei aggiungere commenti, così i miei collaboratori sapranno cosa sta succedendo, ma a me non sembra la soluzione giusta. quindi la mia domanda qual è la soluzione corretta per creare codice comprensibile in questa situazione? Chiedo ai miei colleghi di riscrivere il codice per farlo funzionare con gli array di byte? Lo tengo semplicemente in questo modo?

Un modo per risolvere questo problema nel codice sarebbe: %code% ma questo 'hack' in realtà non lo rende più comprensibile.

Per chiarire, io sono non in cerca di una correzione del codice , posso pensare a diversi (come detto sopra) Sto cercando consigli su come gestirlo o forse un modo per assicurarmi l'editor (ad esempio Visual Studio) si distingue tra loro.

Alcuni contesti extra
Un pezzo di codice vecchio che gestisce la connessione TCP riceve i dati (come dovrebbe) e quindi restituisce una stringa, utilizza la codifica ASCII per creare una stringa dal byte ricevuto [].

Ora siamo arrivati a un punto in cui più in alto abbiamo bisogno di impostare / leggere alcuni byte di stato che, a causa del modo in cui i messaggi provenienti dal livello TCP generano stringhe illeggibili.

È possibile riscrivere il TCP per inviare solo matrici di byte [], ma questo richiederà più tempo di quanto chiunque sia disposto a inserire.

    
posta Vincent 01.06.2015 - 16:38
fonte

2 risposte

3

Si potrebbe fare il confronto dei byte memorizzando le stringhe come costanti, con nomi decenti. Quindi il caso "case STATUS_CRYPTO_1:%code%": diventerebbe %code% che aiuta a rimuovere l'aspetto "numero magico" dell'istruzione switch.

Ma la soluzione corretta qui è aggiungere alcuni commenti. È per questo che sono stati progettati i commenti, questo è il loro scopo. Qualche documentazione nella parte superiore della tua funzione è probabilmente il posto migliore per dire quale sia l'array di byte che stai confrontando, e perché.

    
risposta data 01.06.2015 - 16:52
fonte
7

Come si può già vedere nella domanda, l'uso di caratteri non stampabili direttamente in una stringa letterale rende il codice essenzialmente illeggibile. A prima vista, dovresti dire che il codice presentato non dovrebbe essere compilato perché ci sono più etichette identiche case .

La maggior parte delle lingue (e che include C #) supportano le sequenze di escape per gestire caratteri fastidiosi come interruzioni di riga, virgolette e caratteri non stampabili. Proprio così usereste \n per rappresentare un'interruzione di riga in una stringa, potete usare \x01 per rappresentare il carattere U + 0001 (ASCII SOH) in una stringa.
Questo è molto comunemente usato quando il tipo di stringa è (errato) usato per rappresentare i dati di byte. Ad esempio, il tuo codice diventerebbe:

switch (s)
{
    case "\x00\x00":
        Console.WriteLine("Crypto method 00");
        break;
    case "\x00\x01":
        Console.WriteLine("Crypto method 01");
        break;
    case "\x00\x02":
        Console.WriteLine("Crypto method 02");
        break;
    case "\x00\x03":
        Console.WriteLine("Crypto method 03");
        break;
    default:
        Console.WriteLine(s);
        break;
}
    
risposta data 01.06.2015 - 17:32
fonte

Leggi altre domande sui tag