2011-06-24 48 views
9

我有一段代碼在VB中。我需要將字節數組轉換爲基數64字符串。以下是vb代碼。如何將字節數組轉換爲base64在iphone中的字符串?

如果arrLicence.Count> 0然後

LicenceBytes = CTYPE(Array.CreateInstance(的GetType(字節),6),字節())

 LicenceBytes(0) = Convert.ToByte(arrLicence(0).ToString(), 16) 
     LicenceBytes(1) = Convert.ToByte(arrLicence(1).ToString(), 16) 
     LicenceBytes(2) = Convert.ToByte(arrLicence(2).ToString(), 16) 
     LicenceBytes(3) = Convert.ToByte(arrLicence(3).ToString(), 16) 
     LicenceBytes(4) = Convert.ToByte(arrLicence(4).ToString(), 16) 
     LicenceBytes(5) = Convert.ToByte(arrLicence(5).ToString(), 16) 

     LicenceString = Convert.ToBase64String(LicenceBytes) '6 byteArray - passed by the user - Base64Encoded 

我需要它的等效在iphone中。我嘗試使用NSData和base64轉換,但結果推遲。

我已經使用此鏈接進行轉換。 http://www.cocoadev.com/index.pl?BaseSixtyFour

我嘗試通過使用memcpy創建單個字節,然後創建一個數組,但沒有成功。

我已經試過如下:

NSData *d1 =[@"64" dataUsingEncoding:NSUTF16StringEncoding]; 
NSData *d2 = [@"37" dataUsingEncoding:NSUTF16StringEncoding]; 
NSData *d3 = [@"81" dataUsingEncoding:NSUTF16StringEncoding]; 
NSData *d4 = [@"d4" dataUsingEncoding:NSUTF16StringEncoding]; 

unsigned char *buffer = (unsigned char*)malloc(8); 
buffer[0] = [d1 bytes] ; 
buffer[1] = [d2 bytes] ; 
buffer[2] = [d3 bytes] ; 
buffer[3] = [d4 bytes] ; 

NSData *data = [NSData dataWithBytes:buffer length:4]; 

NSString *str = [self encodeBase64WithData:data]; 
free(buffer); 

這導致IJCgkA==而在.NET代碼返回ZDeB1A==

請注意,轉換是前四個字節的輸入是64,37,81,d4

+0

在NSData或NSMutableData中構建字節數組,然後使用像[this]這樣的代碼(http://stackoverflow.com/questions/392464/any-base64-library-on-iphone-sdk/4727124#4727124)是要走的路。如果你分享你實際嘗試過的東西,也許有人可以指出你出錯的地方。 – Anomie

回答

2
//strBusiCode = @"64-37-81-d4-39-6d"; 
NSArray *tmp_arr = [strBusiCode componentsSeparatedByString:@"-"]; 
NSMutableData *commandToSend= [[NSMutableData alloc] init]; 
unsigned char whole_byte; 
char byte_chars[3] = {'\0','\0','\0'}; 
int i; 
for (i=0; i < [tmp_arr count]; i++) { 
    byte_chars[0] = [[tmp_arr objectAtIndex:i] characterAtIndex:0]; 
    byte_chars[1] = [[tmp_arr objectAtIndex:i] characterAtIndex:1]; 
    whole_byte = strtol(byte_chars, NULL, 16); 
    [commandToSend appendBytes:&whole_byte length:1]; 
} 
return commandToSend; 

該commandToSend然後轉換爲base64數據。

3

見代碼示例,非常自我解釋...

http://www.cocoadev.com/index.pl?BaseSixtyFour

還要檢查以下SO崗位。

How do I do base64 encoding on iphone-sdk?

+0

對不起,我忘了提及我已經使用這些鏈接將字符串轉換爲base64。在這裏陣列正在轉換爲基礎64,所以我沒有得到期望的輸出:( – DivineDesert

+0

@Dimple Panchal:我懷疑轉換問題無論如何。你可以詳細說明你的過程? – Jhaliya

+0

在我的代碼中,每個代碼被轉換爲字節,然後整個字節數組我試圖將單個字符串轉換爲base64,然後附加它,但它不工作:( – DivineDesert

4
unsigned char *buffer = (unsigned char*)malloc(8); 
buffer[0] = [d1 bytes] ; 
buffer[1] = [d2 bytes] ; 
buffer[2] = [d3 bytes] ; 
buffer[3] = [d4 bytes] ; 

你不知道想到這個做什麼。字節返回一個數組,並且您將數組的地址分配給緩衝區的char元素。這個緩衝區將不會被你期望的任何數據填充,並且來自d2的「數據」將會部分地覆蓋來自d1的那些數據。

另外,你不應該對你的字節數組的長度做任何假設,尤其是在使用UTF-16的情況下。

總而言之:您不會在您的轉換例程中丟失您期望的數據。也許在調試器中檢查。

0

您可以使用此base64.h和base64.m類來解碼base64字符串。

base64.h

#import <Foundation/Foundation.h> 

@interface NSData (Base64) 

+ (NSData *)dataWithBase64EncodedString:(NSString *)string; 
- (id)initWithBase64EncodedString:(NSString *)string; 

- (NSString *) base64Encoding; 
- (NSString *) base64EncodingWithLineLength:(unsigned int) lineLength; 

@end 

的base64。m

#import "base64.h" 

static char encodingTable[64] = { 
    'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P', 
    'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f', 
    'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v', 
    'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/' }; 

@implementation NSData (VQBase64) 

- (id)initWithString:(NSString *)string { 
    if (self = [super init]) { 
     [self initWithBase64EncodedString:string]; 
    } 
    return self; 

} 


+ (NSData *) dataWithBase64EncodedString:(NSString *) string { 
    return [[[NSData allocWithZone:nil] initWithBase64EncodedString:string] autorelease]; 
} 

- (id) initWithBase64EncodedString:(NSString *) string { 
    NSMutableData *mutableData = nil; 

    if(string) { 
     unsigned long ixtext = 0; 
     unsigned long lentext = 0; 
     unsigned char ch = 0; 
     unsigned char inbuf[4], outbuf[3]; 
     short i = 0, ixinbuf = 0; 
     BOOL flignore = NO; 
     BOOL flendtext = NO; 
     NSData *base64Data = nil; 
     const unsigned char *base64Bytes = nil; 

     // Convert the string to ASCII data. 
     base64Data = [string dataUsingEncoding:NSASCIIStringEncoding]; 
     base64Bytes = [base64Data bytes]; 
     mutableData = [NSMutableData dataWithCapacity:[base64Data length]]; 
     lentext = [base64Data length]; 

     while(YES) { 
      if(ixtext >= lentext) break; 
      ch = base64Bytes[ixtext++]; 
      flignore = NO; 

      if((ch >= 'A') && (ch <= 'Z')) ch = ch - 'A'; 
      else if((ch >= 'a') && (ch <= 'z')) ch = ch - 'a' + 26; 
      else if((ch >= '0') && (ch <= '9')) ch = ch - '0' + 52; 
      else if(ch == '+') ch = 62; 
      else if(ch == '=') flendtext = YES; 
      else if(ch == '/') ch = 63; 
      else flignore = YES; 

      if(! flignore) { 
       short ctcharsinbuf = 3; 
       BOOL flbreak = NO; 

       if(flendtext) { 
        if(! ixinbuf) break; 
        if((ixinbuf == 1) || (ixinbuf == 2)) ctcharsinbuf = 1; 
        else ctcharsinbuf = 2; 
        ixinbuf = 3; 
        flbreak = YES; 
       } 

       inbuf [ixinbuf++] = ch; 

       if(ixinbuf == 4) { 
        ixinbuf = 0; 
        outbuf [0] = (inbuf[0] << 2) | ((inbuf[1] & 0x30) >> 4); 
        outbuf [1] = ((inbuf[1] & 0x0F) << 4) | ((inbuf[2] & 0x3C) >> 2); 
        outbuf [2] = ((inbuf[2] & 0x03) << 6) | (inbuf[3] & 0x3F); 

        for(i = 0; i < ctcharsinbuf; i++) 
         [mutableData appendBytes:&outbuf[i] length:1]; 
       } 

       if(flbreak) break; 
      } 
     } 
    } 

    self = [self initWithData:mutableData]; 
    return self; 
} 

- (NSString *) base64Encoding { 
    return [self base64EncodingWithLineLength:0]; 
} 

- (NSString *) base64EncodingWithLineLength:(unsigned int) lineLength { 
    const unsigned char  *bytes = [self bytes]; 
    NSMutableString *result = [NSMutableString stringWithCapacity:[self length]]; 
    unsigned long ixtext = 0; 
    unsigned long lentext = [self length]; 
    long ctremaining = 0; 
    unsigned char inbuf[3], outbuf[4]; 
    unsigned short i = 0; 
    unsigned short charsonline = 0, ctcopy = 0; 
    unsigned long ix = 0; 

    while(YES) { 
     ctremaining = lentext - ixtext; 
     if(ctremaining <= 0) break; 

     for(i = 0; i < 3; i++) { 
      ix = ixtext + i; 
      if(ix < lentext) inbuf[i] = bytes[ix]; 
      else inbuf [i] = 0; 
     } 

     outbuf [0] = (inbuf [0] & 0xFC) >> 2; 
     outbuf [1] = ((inbuf [0] & 0x03) << 4) | ((inbuf [1] & 0xF0) >> 4); 
     outbuf [2] = ((inbuf [1] & 0x0F) << 2) | ((inbuf [2] & 0xC0) >> 6); 
     outbuf [3] = inbuf [2] & 0x3F; 
     ctcopy = 4; 

     switch(ctremaining) { 
      case 1: 
       ctcopy = 2; 
       break; 
      case 2: 
       ctcopy = 3; 
       break; 
     } 

     for(i = 0; i < ctcopy; i++) 
      [result appendFormat:@"%c", encodingTable[outbuf[i]]]; 

     for(i = ctcopy; i < 4; i++) 
      [result appendString:@"="]; 

     ixtext += 3; 
     charsonline += 4; 

     if(lineLength > 0) { 
      if(charsonline >= lineLength) { 
       charsonline = 0; 
       [result appendString:@"\n"]; 
      } 
     } 
    } 

    return [NSString stringWithString:result]; 
} 

@end 

請檢查並讓我知道是否有問題。

0

如果你看看你給出的最後2個數字作爲例子,你會注意到轉換匹配。因爲嗨和低部分是相同的。

只需交換喜和低語。

+0

而我真的沒有看到關於此頁上所有代碼的點!-) – Moose

+0

點。 ..對不起, – Moose

+0

對不起,'Tripper'徽章應該存在,至少對我來說。 使用OpenSSL是一個可能的選項 http://www.x2on.de/2010/12/16/tutorial-然後你可以使用BIO函數來編碼或者解碼(dec)頌歌64位,以及其他有用的東西.. – Moose

相關問題