March 22, 2012

เปลี่ยน hex string ให้กลายเป็น NSData จริง

สมมติว่าเรามี NSString ที่เป็นเลขฐาน 16 อยู่แบบนี้

NSString *hexString = @"8A9B1133";

เราจะเห็นว่าถ้าเราแปลง string ชุดนี้ให้เป็น NSData มันจะมีความยาว 4 byte
ส่วนวิธีในการแปลง เราจะใช้วิธีอ่านอักขระใน string เข้ามาเป็นคู่ๆ จากนั้นใช้ฟังก์ชั่น strtol ช่วยในการแปลงอักขระให้กลายเป็นตัว int ก่อน เสร็จแล้วก็ทยอย append ให้กับตัวแปร NSMutableData ตามลำดับ


// ถ้า hex string ที่จะแปลงไม่ครบคู่ก็จะไม่ทำอะไร
if (hexString.length % 2) {
    return nil;
}

NSMutableData *result = [[NSMutableData alloc] init];
unsigned char byte;
char hexChars[3] = {0};
for (int i = 0; i < (hexString.length 2); i++) {
    hexChars[0] = [hexString characterAtIndex:i * 2];
    hexChars[1] = [hexString characterAtIndex:i * 1];
    byte = strtol(hexChars, NULL, 16);
    [result appendBytes: &byte length1]; 
}

NSLog(@"result = %@, length = %d", result, result.length);


ทดลองรันโปรแกรม จะพบผลลัพธ์ออกมาดังนี้


result = <8a9b1133>, length = 4


เท่านี้เราก็มี NSData พร้อมใช้งานแล้ว