2011-06-24 11 views
9

Mam kawałek kodu w VB. Muszę przekonwertować tablicę bajtów na 64 ciąg znaków. Poniżej znajduje się kod vb.jak przekonwertować tablicę bajtów do base64 String w iPhone?

Jeśli arrLicence.Count> 0 Then

LicenceBytes = CType (Array.CreateInstance (GetType (bajtów), 6), bajt())

 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 

trzeba jej odpowiednik w iphone. Próbowałem z NSData i base64 konwersji, ale wynik odstrasza.

Użyłem tego linku do konwersji. http://www.cocoadev.com/index.pl?BaseSixtyFour

Próbowałem przez tworzenie poszczególnych bajtów przy użyciu memcpy, a następnie tworzenie tablicy, ale bez powodzenia.

Co starałem się następująco:

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

Wynika to w IJCgkA== natomiast kod w .NET zwraca ZDeB1A==

Należy pamiętać, że konwersja jest dla pierwszych czterech bajtów od arrLicence a wejściowy 64, 37, 81, D4

+0

Budowanie tablicy bajtów w pliku NSData lub NSMutableData, a następnie użycie kodu takiego jak [this] (http://stackoverflow.com/questions/392464/any-base64-library-on-iphone-sdk/4727124#4727124) to droga do przebycia. Jeśli podzielisz się tym, czego faktycznie próbowałeś, być może ktoś wskaże ci, gdzie popełniłeś błąd. – Anomie

Odpowiedz

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; 

Ten commandToSend jest następnie konwertowany na dane base64.

3

Zobacz przykładowy kod, bardzo własny wyjaśnione ...

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

Sprawdź również poniżej SO postu.

How do I do base64 encoding on iphone-sdk?

+0

Przepraszam, zapomniałem wspomnieć, że użyłem tych linków, aby przekonwertować ciąg na base64. Tutaj tablice są konwertowane do bazy 64, więc nie otrzymuję pożądanych danych wyjściowych :( – DivineDesert

+0

@Dimple Panchal: Podejrzewam, że problemy z konwersją i tak mógłbyś rozwinąć swój proces? – Jhaliya

+0

W moim kodzie każdy kod jest konwertowany na Bytes, a następnie cała tablica bajtów jest konwertowane na łańcuch podstawowy 64. Próbowałem konwertować poszczególnych ciąg do base64, a następnie dołączyć, ale nie działa :( – 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] ; 

Nie wiem, czego można się spodziewać to zrobić. bajty zwracają tablicę i przypisujesz adresy tablic do elementów char twojego bufora. Ten bufor nie zostanie wypełniony żadnymi oczekiwanymi danymi, a "dane" z d2 częściowo nadpisują te z d1 itd.

Ponadto, nie powinieneś przyjmować zbyt wielu założeń dotyczących długości tablic bajtowych , zwłaszcza jeśli używasz UTF-16.

Jednym słowem: Nie wyrzucaj danych można oczekiwać w rutynowych konwersji. Może sprawdź to w debugerze.

0

Można użyć tej base64.h i base64.m klasę zdekodować do base64 ciąg.

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 

Proszę sprawdzić i daj mi znać, jeśli jakiś problem.

0

Jeśli spojrzysz na 2 ostatnie cyfry podane jako przykład, zauważysz dopasowanie konwersji. Ponieważ cześć i niskie części są takie same.

Po prostu zamień hi i low words.

+0

I naprawdę nie widzę podpowiedzi na temat całego tego kodu na tej stronie! ;-) – Moose

+0

o to chodzi. .. sorry – Moose

+0

Przykro mi, chłopaki, znaczek "Tripper" powinien istnieć, przynajmniej dla mnie .. Korzystanie z OpenSSL jest możliwą opcją http://www.x2on.de/2010/12/16/tutorial- script-for-building-openssl-for-ios-iphoneipad/ Następnie możesz użyć funkcji BIO do kodowania lub dekodowania od 64bit, wśród innych przydatnych rzeczy .. – Moose

Powiązane problemy