Frage

Dies ist ein weiterer Riss an meinem MD5 Problem. Ich weiß, dass das Problem mit dem ASCII-Zeichen ist © (0xA9, 169). Entweder es ist die Art, wie ich das Zeichen in den String am Einsetzen oder seine höheren vs unteren Byte Problem.

Wenn ich

 NSString *source = [NSString stringWithFormat:@"%c", 0xa9];

    NSData *data = [source dataUsingEncoding:NSASCIIStringEncoding];

    NSLog(@"\n\n ############### source %@ \ndata desc %@", source, [data description]);

CC_MD5([data bytes], [data length], result);

     return [NSString stringWithFormat:
   @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
   result[0], result[1], result[2], result[3], 
   result[4], result[5], result[6], result[7],
   result[8], result[9], result[10], result[11],
   result[12], result[13], result[14], result[15]
   ];

Ergebnis:

######### Quelle ©

[data description] = (null)
md5: d41d8cd98f00b204e9800998ecf8427e

Werte: int 169 Zeichen ©

Wenn ich die Codierung ändern

NSData *data = [NSData dataWithBytes:[source UTF8String] length:[source length]];

Das Ergebnis ist

######### Quelle ©

[data description] = "<" c2>
md5: 6465dad1d31752be3f3283e8f70feef7

Wenn ich die Codierung ändern

NSData *data = [NSData dataWithBytes:[source UTF8String] length:[source lengthOfBytesUsingEncoding:NSUTF8StringEncoding]];

Das Ergebnis ist  ############### Quelle © len 2 [Data description] = "<" c2a9>
md5: a541ecda3d4c67f1151cad5075633423

Wenn ich die gleiche Funktion in Java Ich betreiben get

">>>>> msg ## \ 251 \ 251
  md5 a252c2c85a9e7756d5ba5da9949d57ed

Die Frage ist, was der beste Weg ist, um die gleiche Byte in ObjC zu bekommen, wie ich in Java erhalten?

War es hilfreich?

Lösung 2

Dank GBegan Erklärung in einem anderen Beitrag konnte ich diese zusammenschustern.

for(int c = 0; c < [s length]; c++){
    int number = [s characterAtIndex:c];
    unsigned char c[1];
    c[0] = (unsigned char)number;
    NSMutableData *oneByte = [NSMutableData dataWithBytes:&c length:1];

}

Andere Tipps

„ASCII zu NSData“ macht keinen Sinn, weil ASCII eine Codierung ist; wenn Sie Zeichen codiert haben, dann haben Sie Daten.

Eine Codierung ist eine Transformation von idealen Unicode-Zeichen (Code-Punkte) in Ein-oder-mehr-Byte-Einheiten (Code-Einheiten), eventuell in Sequenzen wie UTF-16 Surrogat-Paare.

Ein NSString ist mehr oder weniger ein ideales Unicode-Objekt. Es enthält die Zeichen der Zeichenfolge in Unicode, unabhängig von einer Codierung *.

ASCII ist eine Codierung. UTF-8 ist auch eine Kodierung. Wenn Sie die Zeichenfolge für seine UTF8String fragen, Sie fragen sie ihre Zeichen als UTF-8 zu kodieren.

NSData *data = [NSData dataWithBytes:[source UTF8String] length:[source length]];
     

Das Ergebnis ist

 ######### source ©
 [data description] = "<"c2>

Das ist, weil Sie die falsche Länge übergeben. Die Zeichenfolge der Länge (in Zeichen) ist nicht das gleiche wie die Anzahl von Codeeinheiten (Bytes, in diesem Fall) in irgendeiner Codierung.

Die richtige Länge ist strlen([source UTF8String]), aber es ist einfacher für Sie und schneller zur Laufzeit zu nutzen dataUsingEncoding: die Zeichenfolge zu bitten, das NSData Objekt für Sie zu erstellen.

  

Wenn ich die Codierung ändern

NSData *data = [NSData dataWithBytes:[source UTF8String] length:[source lengthOfBytesUsingEncoding:NSUTF8StringEncoding]];

Sie haben nicht die Codierung ändern. Du bist immer noch als UTF-8-Codierung.

Mit dataUsingEncoding:.

  

Die Frage ist, was der beste Weg ist, um die gleiche Byte in ObjC zu bekommen, wie ich in Java erhalten?

Verwenden Sie die gleiche Codierung.

Es gibt nicht so etwas wie „extended ASCII“. Es gibt verschiedene Kodierungen, die auf (oder zumindest kompatibel) ASCII basieren, einschließlich ISO 8859-1, ISO 8859-9, MacRoman, Windows-Codepage 1252, und UTF-8. Sie müssen entscheiden, welchen Sie meinen und die Zeichenfolge sagen seine Charaktere mit, dass zu kodieren.

Noch besser wäre es, weiterhin mit UTF-8-es fast immer die richtige Wahl ist für meist-ASCII-Text-und Java-Code ändern, statt.

NSData *data = [source dataUsingEncoding:NSASCIIStringEncoding];
     

Ergebnis:

[data description] = (null)

True ASCII nur 128 mögliche Zeichen kodieren. Unicode enthält alle ASCII unverändert, so dass die ersten 128 Codepunkte in Unicode sind, was ASCII kann kodieren. Alles andere, ASCII kann nicht kodieren.

Ich habe vor als gleichwertig zu NSASCIIStringEncoding NSISOLatin1StringEncoding verhalten gesehen; es klingt wie sie es geändert haben könnten eine reine ASCII-Kodierung zu sein, und wenn das der Fall ist, das ist eine gute Sache. Es gibt kein Copyright-Symbol in ASCII. Was Sie hier sehen, ist das richtige Ergebnis.


* Dies ist nicht ganz richtig; die Zeichen werden als UTF-16 ausgesetzt, so dass alle Zeichen außerhalb der Basic Multilingual Plane als Ersatzpaar ausgesetzt sind, nicht ganze Zeichen, wie sie in einem wirklich ideal String-Objekt sein würden. Dies ist ein Kompromiss. In Swift ist der Einbau-String-Typ ein perfektes ideal Unicode-Objekt; Zeichen sind Zeichen, nie bis codiert geteilt. Aber wenn sie mit NSString (ob in Swift oder in Objective-C) arbeitet, soweit Sie betroffen sind, sollten Sie es als eine ideale Saite behandeln.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top