L'utilizzo di C#, che è il metodo più efficiente per la conversione di una stringa contenente i dati binari in un array di byte

StackOverflow https://stackoverflow.com/questions/72176

  •  09-06-2019
  •  | 
  •  

Domanda

Mentre ci sono 100 strade per risolvere il problema di conversione, sto concentrando sulle prestazioni.

Dare che la stringa contiene solo dati binari, qual è il metodo più veloce, in termini di prestazioni, di conversione che dati un byte[] (non char[]) in C#?

Chiarimento:Questo non è ASCII dati e non dati binari che capita di essere in una stringa.

È stato utile?

Soluzione

Io non sono sicuro di ASCIIEncoding.GetBytes sta per farlo, perché supporta solo il range da 0x0000 a 0x007F.

Dite la stringa contiene solo byte.Ma un .NET stringa è un array di caratteri, e 1 char è di 2 byte (a causa di un .NET negozi di stringhe come UTF16).Così si possono avere due situazioni per memorizzare i byte 0 x 42 e 0x98:

  1. La stringa è una stringa ANSI e contenuti byte e viene convertito in una stringa unicode, quindi il byte sarà 0x00 0x42 0x00 0x98.(La stringa viene memorizzata come 0x0042 e 0x0098)
  2. La stringa è stata solo una matrice di byte che si classificati o appena ricevuto una stringa e così divenne il seguente byte 0 x 42 0x98.(La stringa viene memorizzata come 0x9842)

Nel primo caso, il risultato sarebbe 0x42 e 0x3F (ascii "B?").La seconda situazione comporterebbe 0x3F (ascii per "?").Questo è logico, perché i caratteri sono al di fuori di valido intervallo ascii e l'encoder non sa cosa fare con quei valori.

Quindi mi chiedo perché è una stringa di byte?

  • Forse contiene un byte codificato come una stringa (per esempio Base64)?
  • Forse si dovrebbe iniziare con un array di char o un array di byte?

Se davvero hanno situazione 2 e si desidera ottenere i byte di fuori di esso, si dovrebbe utilizzare il UnicodeEncoding.GetBytes chiamata.Perché sarà di ritorno 0x42 e 0x98.

Se vuoi andare da un char array di array di byte, il modo più veloce sarebbe il Marshalling..Ma non è davvero bello, e usa il doppio di memoria.

public Byte[] ConvertToBytes(Char[] source)
{
    Byte[] result = new Byte[source.Length * sizeof(Char)];
    IntPtr tempBuffer = Marshal.AllocHGlobal(result.Length);
    try
    {
        Marshal.Copy(source, 0, tempBuffer, source.Length);
        Marshal.Copy(tempBuffer, result, 0, result.Length);
    }
    finally
    {
        Marshal.FreeHGlobal(tempBuffer);
    }
    return result;
}

Altri suggerimenti

C'è nessuna tale cosa come una stringa ASCII in C#!Stringhe sempre contengono UTF-16.Non rendendosi conto che questo porta ad un sacco di problemi.Detto questo, i metodi menzionati prima di andare al lavoro perché ritengono che la stringa codificati in UTF-16 e trasformare i caratteri ASCII simboli.

/EDIT in risposta ai chiarimenti:come ha fatto il binario di dati nella stringa?Le stringhe non dovrebbe contenere dati binari (uso byte[] per che).

Se si desidera passare da una stringa di dati binari, si deve sapere che codifica utilizzata per la conversione dei dati binari in una stringa, in primo luogo.In caso contrario, si potrebbe non finire con il corretto di dati binari.Così, il modo più efficace è probabilmente GetBytes() su una Codifica sottoclasse (come UTF8Encoding), ma è necessario sapere per certo che la codifica.

Il commento di Kent Boogaart sulla domanda originale riassume abbastanza bene.;]

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