2017-04-12 4 views
0

Ich muss eine Anzahl von Unicode-Zeichenfolgen aus SOAP-Aufrufen und SQL Server-Aufrufen abrufen. Dann muss ich alles in ein Byte [] in UTF7 konvertieren, damit es über einen Socket an einen Server gesendet werden kann, der eine UTF7-Bytefolge erwartet. Da ich nach jeder Zeichenfolge Steuerbytes einfügen muss, kann ich die Zeichenfolgen nicht einfach verketten und einen Encoding-Aufruf verwenden. (vereinfachtes Codebeispiel):Konvertieren mehrerer Zeichenfolgen in ein Byte []

Encoding enc = Encoding.UTF7; 
byte[] bytes = new byte[16384]; 
int idx = 0; 
bytes[idx++] = 11; // Starting control code 

// create an array of strings from different sources. 
string[] strs = GetTheStrings(); 

foreach (string str in strs) 
{ 
    bytes[idx] = enc.GetBytes(str); // Error 

    idx += enc.GetByteCount(str); 
    bytes[idx++] = 13; // line ending CR 


} 
bytes[idx] = 28; // ending control code 

return bytes; 

Ich bekomme einen Fehler von VS sagen, dass enc.GetBytes (str); "Kann den Typ byte [] nicht explizit in das Byte & umwandeln, fügt etwas hinzu, das die Encoding-Klasse überschreiben muss. Warum behandelt VS Bytes [idx] anders als beispielsweise byte [] bytes2 - was String für String funktioniert?" Ich habe mich an C/++, Java und viele andere Sprachen gewöhnt, aber C# scheint mich immer aufzufangen.Ich möchte keinen unsicheren Codeblock verwenden, um dies mit Zeigern zu tun, was unendlich einfacher wäre, weil andere es nicht tun Ich weiß nicht, dass Pointer und das Speichermanagement es behalten müssen Da die Bytes [idx] sich auf ein einzelnes Byte beziehen und nicht auf das Array, das es erwartet, gibt es eine Art von Cast, mit der ich das umgehen kann? eine besser angepasste Methode zu verwenden?

Ich habe ein Dutzend Sites mit Beispielcode angeschaut, aber dieses Problem mit mehreren Strings wird nie angezeigt. Soll ich jede Zeichenfolge in ein separates Byte [] laden und dann bei der zusammenführen Ende?

+0

Keine der erwähnten Sprachen behandeln Byte ('Bytes [idx]') als Array von Bytes ... Sie möchten möglicherweise nicht verwandte Informationen aus dem Post bearbeiten, um Diskussionen über diese Teile zu vermeiden. –

Antwort

1

Sie versuchen, ein Array von Bytes einem einzelnen byte zuzuweisen.

Sie müssen jede byte separat zuweisen:

var bytes = enc.GetBytes(str); 
foreach(var b in bytes) 
{ 
    bytes[idx++] = b; 
} 

Danach Sie nicht idx aktualisieren müssen mit idx += enc.GetByteCount(str);

+0

Vorsicht bei IndexOutOfRangeExceptions, wenn 'idx' zu> =' bytes.Length' wird. –

+0

Das dachte ich, aber angesichts der schieren Menge an Daten (dies sind alle HL7 HIPAA-Daten für viele Patienten in einem größeren Krankenhaus, hatte ich auf einige gehofft Ich hasse es, etwas mit roher Gewalt zu klemmen, aber ich denke, ich muss hier sein. Danke, dass du meine schlimmsten Befürchtungen bestätigt hast. – MiddleAgedMutantNinjaProgrammer

+0

Ich werde den Byte [] Bereich nicht ausblasen. Ich werde nur einen einzigen Patienten gleichzeitig über die Steckdose schicken, und ich kann die Array-Größe erheblich erhöhen (es hat bereits einen 50% -Fudge-Faktor). Danke für die Warnung. – MiddleAgedMutantNinjaProgrammer

1

Encoding.GetBytes bereits erledigt den größten Teil der Arbeit des Kopierens von Daten auf demselben Array für Sie , der einzige erforderliche Schritt besteht darin, die Größe des Arrays zu ermitteln, die auch im selben MSDN-Artikel enthalten ist:

Um die zu berechnen Um die resultierenden Bytes zu speichern, müssen Sie die GetByteCount-Methode aufrufen. Um die maximale Array-Größe zu berechnen, rufen Sie die GetMaxByteCount-Methode auf. Die GetByteCount-Methode ermöglicht im Allgemeinen die Zuweisung von weniger Arbeitsspeicher, während die GetMaxByteCount-Methode im Allgemeinen schneller ausgeführt wird.

Rufen Sie einfach GetByteCount für jede Zeichenfolge und dann GetBytes mit steigenden Offsets aufrufen.

+0

Sie brauchen nicht einmal den 'GetByteCount'. Diese Zeile wird den Trick machen: 'idx + = enc.GetBytes (str, 0, str.Length, Bytes, idx);' –

0

Zum Teufel damit. Ich entschied mich, es in C (unsicherer Code) zu machen und es einfach gut für diejenigen zu kommentieren, die folgen könnten.

Verwandte Themen