Die Nachricht in Websphere MQ über C # hat eine andere Datenlänge als die gleiche Nachricht manuell zu senden

8
%Vor%

Unter Verwendung von C # mit dem obigen Code, wenn ich die Nachricht in die Warteschlange eingabe, ist die Datenlänge der Nachricht 3600.

Wenn ich die Nachricht manuell in die Warteschlange eingib, indem ich mit der rechten Maustaste auf die Warteschlange klicke und die Option Testnachricht einfügen auswähle, lautet die Datenlänge der Nachricht 1799.

Ich bin wirklich verwirrt, warum das so ist. Die Nachricht ist in beiden Fällen eine XML-Zeichenfolge mit Deklaration. In Notepad ++ gibt es 1811 Zeichen einschließlich der Deklaration. Wenn ich die Nachricht im Debugger vor der Eingabe in die Warteschlange anzeigen lasse, wird die Nachricht in xml ohne Zeilen- oder Rückführwagen konvertiert.

Ich habe den XML-String mit folgendem Befehl erstellt:

%Vor%

Fehle ich irgendetwas in meiner C # Implementierung, das zusätzliche Zeichen hinzufügt?

Danke.

    
InfoLearner 11.08.2011, 17:30
quelle

1 Antwort

12

Wie @Matten vorschlägt, könnte ein Problem die Zeichencodierung sein.

Der Standardwert für CharacterSet Eigenschaft ist 1200 (UNICODE) und WriteString wird in die von CharacterSet angegebene Codepage konvertiert.

Code Seite 1200 ist UTF-16 little-endian, so dass Sie wahrscheinlich zwei Bytes pro Zeichen erhalten. Es ist sicherlich möglich, dass "Put Test Message" eine andere Codierung verwendet, die ein Byte pro Zeichen für gemeinsame Zeichen verwendet.

Unter der Annahme, dass die Längen 3600 und 1799 in Bytes gezählt werden, könnten sie 1800 UTF-16LE-Zeichen und 1799 UTF-8-Zeichen (oder 1799 ASCII-Zeichen oder 1799 EBCDIC-Zeichen ...) darstellen.

Das lässt uns immer noch einen Längenunterschied von einem Zeichen. Vielleicht enthält WriteString ein abschließendes NULL-Zeichen in der geschriebenen Zeichenfolge?

Sind Sie sicher, dass Sie dem Count Notepad ++ vertrauen? Wenn Put Test Message 1799 Zeichen in eine Nachricht geschrieben hat, waren wahrscheinlich 1799 Zeichen in den Daten enthalten, die Sie an sie übergeben haben.

Bearbeiten: Unter der Annahme, dass die Codierungstheorie korrekt ist, können Sie die Nachricht verkürzen, indem Sie eine andere Codierung verwenden. Wie kurz eine Codierung eine bestimmte Nachricht machen würde, hängt vom tatsächlichen Inhalt der Zeichenfolge ab.

Sie können beispielsweise eine ASCII-Codierung verwenden, um ein Byte pro Zeichen zu erhalten.

%Vor%

Das würde Ihre Nachricht auf 1800 Bytes verkürzen, wenn alle Zeichen in Ihrer XML-Zeichenfolge eine ASCII-Darstellung hätten.

Eine Alternative wäre UTF-8-Codierung.

%Vor%

Die Verwendung von UTF-8 hat den Vorteil, dass (im Gegensatz zu ASCII) alle Zeichen eine Darstellung haben (für bestimmte Werte von "all"). Der Nachteil ist, dass einige Zeichen zwei, drei oder sogar vier Bytes benötigen, um sie darzustellen. Die gebräuchlichsten Zeichen werden in einem Byte codiert, dann werden die nächsten gebräuchlichsten Zeichen in zwei Bytes codiert und so weiter.

Im besten Fall würde eine UTF-8-Codierung auch 1800 Byte ergeben. Im schlimmsten Fall würde es Ihnen 7200 Bytes geben, aber das scheint sehr unwahrscheinlich, es sei denn, Sie verwenden etwas wie Klingon!

    
Frank Boyne 11.08.2011, 18:36
quelle

Tags und Links