2013-12-20 95 views
1

我需要將NSInteger和NSString表示爲字節數組。以下是我正在尋找的樣品。將NSInteger和NSString轉換爲字節數組

對於如何,這harcodings工作正常。我想通過代碼來做到這一點。任何線索。

首先,NSInteger的成十六進制字節:

NSInteger test = 1; 
unsigned char byte[] = { 0x00, 0x01 }; 

NSInteger test = 16; 
unsigned char byte[] = { 0x00, 0x10 }; 
NSData *data = [NSData dataWithBytes:byte length:sizeof(byte)]; 

其次,的NSString成十六進制字節:

NSString *test = @"31C5B562-BD07-4616-BCBD-130BA6822790"; 
unsigned char byte[] = {0x31, 0xC5, 0xB5, 0x62, 0xBD, 0x07, 0x46, 0x16, 0xBC, 0xBD, 0x13, 0x0B, 0xA6, 0x82, 0x27, 0x90}; 
NSData *data = [NSData dataWithBytes:byte length:sizeof(byte)]; 

我試着用下面的代碼,它可以很好地用於我的UUID但NSInteger的到要工作我需要發送「0010」而不是16和「0001」而不是1.因此,任何線索如何做這種轉換。

- (NSData *)hexData { 
    NSMutableData *hexData = [NSMutableData data]; 
    int idx = 0; 

    for (idx = 0; idx+2 <= self.length; idx+=2) { 
     NSRange range = NSMakeRange(idx, 2); 
     NSString* hexStr = [self substringWithRange:range]; 
     NSScanner* scanner = [NSScanner scannerWithString:hexStr]; 
     unsigned int intValue; 
     [scanner scanHexInt:&intValue]; 
     [hexData appendBytes:&intValue length:1]; 
    } 

    return hexData; 
} 

編輯:

int8_t test = -59; 
int8_t bytes = CFSwapInt16HostToBig(test); 
NSData *data1 = [NSData dataWithBytes:&bytes length:sizeof(bytes)]; 

晚晴是0xFF,而不是0xC4

+0

查看我的回答對我自己的帖子在這裏: http://stackoverflow.com/a/32951887/1758944 –

+0

查看我的回答類似的職位在這裏: http://stackoverflow.com/a/32951887/1758944 –

回答

5

由於您的字符串是一個UUID字符串,你可以做這樣的事情:

NSString *test = @""; 
uuid_t uuid; 
uuid_parse([test UTF8String], uuid) 
NSData *data = [NSData dataWithBytes:uuid length:16]; 

對於數你可以這樣做:

NSInteger test = 1; 
NSData *data = [NSData dataWithBytes:&test length:sizeof(test)]; 

請記住,NSInteger可能是兩個以上的字節,您可能還需要擔心字節順序。

更新:因爲它似乎你需要的整數值是兩個字節,你應該做的:

uint16_t test = 1; 
NSData *data = [NSData dataWithBytes:&test length:sizeof(test)]; 

這將確保2個字節。您還需要擔心字節順序,所以你真的需要:

uint16_t test = 1; 
uint16_t bytes = CFSwapInt16HostToBig(test); 
NSData *data = [NSData dataWithBytes:&bytes length:sizeof(bytes)]; 

變化CFSwapInt16HostToBigCFSwapInt16HostToLitte如果合適的話。

+0

謝謝! UUID工作正常。 upvoting爲此。我已經嘗試過提到的整數方法,但它不適合我。我必須按照我提到的創建字節流,然後才能正常工作。任何有關如何創建這種字節流的想法。 – Abhinav

+0

我的解決方案有什麼問題?有什麼不同? – rmaddy

+0

實際上,我正在處理接受代表字符串的HEX的硬件。所以,發送16我需要發送一個0x00和0x10字節的數組。使用您的解決方案,它會將該字節流視爲不同的值。請看我更新的問題。 – Abhinav

相關問題