Wenn ich SMS PDU (GSM 7 Bit) Benutzerdaten kodiere / decodiere, muss ich zuerst die UDH voranstellen?

8

Während ich den Benutzerdaten-Teil einer SMS-Nachricht erfolgreich codieren und decodieren kann, wenn ein UDH nicht vorhanden ist, habe ich Probleme, wenn ein UDH ist vorhanden (in diesem Fall für verkettete SMS).

Muss ich beim Dekodieren oder Kodieren der Benutzerdaten dem Text zuvor den UDH voranstellen?

Dieser Artikel enthält ein Codierungsroutinenbeispiel, das die UDH mit Füllbits kompensiert (was ich immer noch nicht vollständig verstehe), aber es gibt kein Beispiel für Daten, die an die Routine weitergegeben werden, so dass ich kein a klarer Anwendungsfall (und ich konnte auf der Website kein Entschlüsselungsmuster finden): Zypern .

Bisher konnte ich einige Ergebnisse erzielen, wenn ich die UDH den Benutzerdaten vordecodiert habe, aber ich vermute, dass dies nur ein Zufall ist.

Als Beispiel (mit Werten von Ссылка ):

%Vor%

Ausgabe: "ß @ ø¿ @hello world"

%Vor%

Gleicher Ausgang: "@ @hello world"

Ohne vor der UDH bekomme ich Müll:

%Vor%

Ausgabe: "PKYY§An§eYI"

Was ist der richtige Umgang damit?

Soll ich die UDH beim Verschlüsseln der Benutzerdaten mit dem Text versehen?

Soll ich die Müllzeichen nach der Entschlüsselung entfernen, oder bin ich (wie ich vermute) mit dieser Annahme völlig von der Basis entfernt?

Während der Decodieralgorithmus hier ohne UDH zu funktionieren scheint, scheint er keine UDH-Informationen zu berücksichtigen: Suchen Sie nach dem GSM 7bit Encoding / Decoding-Algorithmus .

Ich wäre ewig dankbar, wenn mich jemand auf den richtigen Weg setzen könnte. Alle klaren Beispiele / Codebeispiele würden sehr geschätzt werden. ; -)

Ich werde auch eine kleine Beispielanwendung bereitstellen, die die Algorithmen enthält, wenn jemand glaubt, dass es helfen wird, das Rätsel zu lösen.

EDIT 1:

Ich verwende Delphi XE2 Update 4 Hotfix 1

EDIT 2:

Dank der Hilfe von @whosrdaddy konnte ich meine Kodierungs- / Dekodierroutinen erfolgreich einsetzen.

Als Nebenbemerkung war ich neugierig, warum die Benutzerdaten auf einer 7-Bit-Grenze sein mussten, wenn die UDH nicht mit ihr codiert wurde, sondern der letzte Satz im Absatz aus der ETSI-Spezifikation, die von @ zitiert wurde. whosrdaddy hat das geantwortet:

  

Wenn 7-Bit-Daten verwendet werden und der TP-UD-Header nicht an einer Septett-Grenze endet, werden Füllbits nach dem letzten eingefügt   Information Element Daten Oktett, so dass es eine ganzzahlige von   septets für den gesamten TP-UD-Header. Dies ist sicherzustellen, dass der SM   selbst beginnt an einer Oktettgrenze, so dass eine frühere Phase mobil ist   wird in der Lage sein, den SM selbst anzuzeigen, obwohl der TP-UD-Header   im TP-UD-Feld kann nicht verstanden werden

Mein Code basiert teilweise auf Beispielen aus den folgenden Ressourcen:

Suchen nach dem GSM 7bit-Verschlüsselungs- / Decodierungsalgorithmus

>

Ссылка

Zypern

Zypern

Ссылка

Ссылка

Ссылка

Hier ist der Code für alle anderen, die Probleme mit der SMS-Codierung / Decodierung hatten. Ich bin sicher, dass es vereinfacht / optimiert werden kann (und Kommentare sind willkommen), aber ich habe es mit mehreren verschiedenen Permutationen und UDH-Header-Längen mit Erfolg getestet. Ich hoffe es hilft.

%Vor%     
Doug 15.07.2012, 02:54
quelle

2 Antworten

6

Nein, Sie fügen den UDH-Teil beim Codieren nicht hinzu, aber Sie lesen GSM-Phase-2-Spezifikation auf Seite 57, erwähnen sie diese Tatsache:" Wenn 7-Bit-Daten verwendet werden und der TP-UD-Header nicht an einer Septett-Grenze endet, werden Füllbits eingefügt nach dem letzten Informationselement Daten Oktett, so dass es eine ganze Zahl von septets für den gesamten gibt TP-UD header ". Wenn Sie ein UDH-Teil einfügen, kann dies nicht der Fall sein. Sie müssen also nur den Offset berechnen (= Anzahl der Füllbits)

Bei der Berechnung des Offsets wird davon ausgegangen, dass UDHPart ein AnsiString ist:

%Vor%

jetzt, wenn Sie die 7-Bit-Daten codieren, gehen Sie wie normal vor, aber am Ende verschieben Sie die Daten Offset-Bits nach links, dieser Code hat die codierten Daten in Variable Ergebnis (anisstring):

%Vor%

Die Decodierung ist die gleiche Sache, zuerst verschieben Sie die 7-Bit-Daten-Offset-Bits zuerst nach rechts, bevor Sie dekodieren ...

Ich hoffe, dies wird dich auf den richtigen Weg bringen ...

    
whosrdaddy 15.07.2012, 08:36
quelle
1

In Ihrem Fall Daten sind D06536FB0DBABFE56C32

Get erste char ist D0 = & gt; h (in den ersten 7 Bit, das 8. Bit nicht verwenden)

Der Rest ist 6536FB0DBABFE56C32

In Behälter

(01100101) 0011011011111011000011011011101010111111111001010110110000110010

Shift von rechts nach links. = & gt; jedes rechte 7 bit ist ein char!

001100100110110011100101101111111011101000001101111 1101100 110110 (0 1100101)

Ich verschiebe 7 nach links. Sie können String von oben bekommen. aber ich mache es für eine einfache Show: D

(1100101) (1101100) (1101100) (1101111) (0100000) (1110111) (1101111) (1110010) (1101100) (1100100) 00

Und die Zeichenfolge ist "ello world"

Kombiniere mit dem ersten Zeichen, du bekommst "Hallo Welt"

    
Huỳnh Hữu Ân 24.12.2014 04:31
quelle

Tags und Links