سؤال

هذا صدع آخر في مشكلتي MD5. أعلم أن المشكلة مع حرف ASCII © (0xa9 ، 169). إما أنها هي الطريقة التي أقوم بإدخالها في السلسلة أو مشكلة بايت أعلى مقابل أقل.

اذا انا

 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]
   ];

نتيجة:

######### Source ©

وصف البيانات] = (خالية)
MD5: D41D8CD98F00B204E9800998ECF8427E

القيم: int 169 char ©

عندما أقوم بتغيير الترميز إلى

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

النتيجه هي

######### Source ©

وصف البيانات] = "<" C2>
MD5: 6465DAD1D31752BE3F3283E8F70FEEF7

عندما أقوم بتغيير الترميز إلى

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

والنتيجة هي ############### Source © Len 2 [Data Description] = "<" C2A9>
MD5: A541ECDA3D4C67F1151CAD5075633423

عندما أقوم بتشغيل نفس الوظيفة في جافا أحصل عليها

">>>>> msg ## 251 251
MD5 A252C2C85A9E756D5BA5DA9949D57ED

والسؤال هو ما هي أفضل طريقة للحصول على نفس البايت في OBJC كما حصلت على جافا؟

هل كانت مفيدة؟

المحلول 2

بفضل تفسير Gbegan في منشور آخر ، تمكنت من تجميع هذا معًا.

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];

}

نصائح أخرى

"ASCII إلى NSDATA" لا معنى له ، لأن ASCII هو ترميز ؛ إذا كان لديك أحرف مشفرة ، فستكون لديك بيانات.

الترميز هو تحويل لأحرف Unicode المثالية (نقاط الكود) إلى وحدات واحدة أو بايت (وحدات رمز) ، ربما في تسلسلات مثل أزواج UTF-16 البديلة.

NSString هو كائن Unicode مثالي. أنه يحتوي على الشخصيات من السلسلة ، في Unicode ، بغض النظر عن أي تشفير*.

ASCII هو ترميز. UTF-8 هو أيضا ترميز. عندما تسأل السلسلة UTF8String, ، أنت تطلب منها تشفير شخصياتها على أنها UTF-8.

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

النتيجه هي

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

ذلك لأنك مررت بالطول الخطأ. طول السلسلة (في الأحرف) ليس هو نفس عدد وحدات التعليمات البرمجية (البايتات ، في هذه الحالة) في بعض الترميز.

الطول الصحيح هو strlen([source UTF8String]), ، لكن الأمر أسهل بالنسبة لك وأسرع في وقت التشغيل dataUsingEncoding: لطلب السلسلة لإنشاء كائن NSDATA لك.

عندما أقوم بتغيير الترميز إلى

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

أنت لم تغير الترميز. لا تزال ترميزها على أنها UTF-8.

يستخدم dataUsingEncoding:.

والسؤال هو ما هي أفضل طريقة للحصول على نفس البايت في OBJC كما حصلت على جافا؟

استخدم نفس الترميز.

لا يوجد شيء مثل "ASCII الممتد". هناك العديد من الترميزات المختلفة التي تستند إلى (أو على الأقل متوافقة مع) ASCII ، بما في ذلك ISO 8859-1 و ISO 8859-9 و MacRoman و Windows Codepage 1252 و UTF-8. تحتاج إلى تحديد أي واحد تقصده واطلب السلسلة لترميز أحرفها مع ذلك.

والأفضل من ذلك ، استمر في استخدام UTF-8-إنه دائمًا ما يكون الخيار الصحيح لنص الغالب ASCII-وتغيير رمز Java بدلاً من ذلك.

NSData *data = [source dataUsingEncoding:NSASCIIStringEncoding];

نتيجة:

[data description] = (null)

يمكن أن يقوم ASCII الحقيقي بتشفير 128 حرفًا محتملاً فقط. يتضمن Unicode جميع ASCII دون تغيير ، وبالتالي فإن أول 128 نقطة رمز في Unicode هي ما يمكن أن تشفره ASCII. أي شيء آخر ، لا يمكن أن يشفر ASCII.

رأيت NSASCIIStringEncoding تتصرف على أنه ما يعادل NSISOLatin1StringEncoding قبل؛ يبدو أنهم ربما قاموا بتغييره ليكون ترميز ASCII خالصًا ، وإذا كان هذا هو الحال ، فهذا أمر جيد. لا يوجد رمز حقوق الطبع والنشر في ASCII. ما تراه هنا هو النتيجة الصحيحة.


*هذا ليس صحيحا تماما؛ تتعرض الشخصيات على أنها UTF-16 ، لذلك تتعرض أي أحرف خارج المستوى الأساسي متعدد اللغات كأزواج بديلة ، وليس أحرفًا كاملة لأنها ستكون في كائن سلسلة مثالي حقًا. هذه مفاضلة. في Swift ، يعد نوع السلسلة المدمجة كائن Unicode مثالي مثالي ؛ الشخصيات هي الشخصيات ، لا تنقسم أبدًا حتى يتم ترميزها. ولكن عند العمل مع NSString (سواء في سريع أو في الهدف-C) ، بقدر ما تشعر بالقلق ، يجب أن تعاملها كسلسلة مثالية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top