【问题标题】:how to convert array of bytes to base64 String in iphone?如何在iphone中将字节数组转换为base64字符串?
【发布时间】:2011-09-21 21:43:51
【问题描述】:

我在vb中有一段代码。我需要将字节数组转换为 base 64 字符串。以下是vb代码。

如果 arrLicence.Count > 0 那么

LicenceBytes = CType(Array.CreateInstance(GetType(Byte),6), Byte())

        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==

请注意,转换是针对 arrLicence 的前四个字节,输入是 64、37、81、d4

【问题讨论】:

  • 在 NSData 或 NSMutableData 中构建字节数组,然后使用像 this 这样的代码是可行的方法。如果你分享你实际尝试过的东西,也许有人可以指出你哪里出错了。

标签: iphone objective-c base64


【解决方案1】:

试试这个,希望对你有帮助。 get-base64-nsstring-from-nsdata

【讨论】:

    【解决方案2】:
    unsigned char *buffer = (unsigned char*)malloc(8);
    buffer[0] =  [d1 bytes]  ;
    buffer[1] =  [d2 bytes] ;
    buffer[2] =  [d3 bytes] ;
    buffer[3] =  [d4 bytes] ;
    

    不确定您希望这样做。 bytes 返回一个数组,并且您将数组的地址分配给缓冲区的 char 元素。此缓冲区不会填充您期望的任何数据,来自 d2 的“数据”将部分覆盖来自 d1 等的数据。

    此外,您不应该对字节数组的长度做出太多假设,尤其是在使用 UTF-16 时。

    简而言之:您不会在转换例程中抛出您期望的数据。也许在调试器中检查一下。

    【讨论】:

      【解决方案3】:

      查看代码示例,非常不言自明...

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

      还可以查看下面的 SO 帖子。

      How do I do base64 encoding on iphone-sdk?

      【讨论】:

      • 对不起,我忘了提到我已经使用这些链接将字符串转换为 base64。这里的数组被转换为base 64,所以我没有得到想要的输出:(
      • @Dimple Panchal:无论如何我都怀疑转换问题。你能详细说明你的过程吗?
      • 在我的代码中,每个代码都被转换为字节,然后整个字节数组被转换为 base 64 字符串。我尝试将单个字符串转换为 base64,然后附加它,但它不起作用:(
      【解决方案4】:
      //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 数据。

      【讨论】:

        【解决方案5】:

        如果您查看您给出的最后 2 个数字作为示例,您会注意到转换匹配。因为高低部分是一样的。

        只需交换 hi 和 low 词。

        【讨论】:

        • 我并没有真正看到这个页面上所有代码的意义! ;-)
        • 抱歉,'Tripper' 徽章应该存在,至少对我来说是这样。使用 OpenSSL 是一个可能的选项x2on.de/2010/12/16/… 然后您可以使用 BIO 函数对 64 位进行编码或解码,等等有用的东西..
        【解决方案6】:

        您可以使用此 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
        

        如果有任何问题,请检查并告诉我。

        【讨论】:

          猜你喜欢
          • 2016-10-21
          • 2012-07-21
          • 2017-05-21
          • 1970-01-01
          • 2016-10-21
          • 1970-01-01
          • 1970-01-01
          • 2017-10-02
          • 2017-07-10
          相关资源
          最近更新 更多