java - UInt8 数组到 Base64 字符串 Swift(包括 Java 示例)

标签 java swift encoding base64

我需要一种将 UInt8 数组转换为 Base64 字符串的方法。我有一个 Java 示例,但我无法将该 Java 代码转换为 Swift。这是java代码:

private static String getBase64(byte[] buffer)
{
    final char[] map = {
            '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', '+', '/'
    };

    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < buffer.length; i++)
    {
        byte b0 = buffer[i++], b1 = 0, b2 = 0;

        int bytes = 3;
        if (i < buffer.length)
        {
            b1 = buffer[i++];
            if (i < buffer.length)
            {
                b2 = buffer[i];
            }
            else
            {
                bytes = 2;
            }
        }
        else
        {
            bytes = 1;
        }

        int total = (b0 << 16) | (b1 << 8) | b2;

        switch (bytes)
        {
            case 3:
                sb.append(map[(total >> 18) & 0x3f]);
                sb.append(map[(total >> 12) & 0x3f]);
                sb.append(map[(total >> 6) & 0x3f]);
                sb.append(map[total & 0x3f]);
                break;

            case 2:
                sb.append(map[(total >> 18) & 0x3f]);
                sb.append(map[(total >> 12) & 0x3f]);
                sb.append(map[(total >> 6) & 0x3f]);
                sb.append('=');
                break;

            case 1:
                sb.append(map[(total >> 18) & 0x3f]);
                sb.append(map[(total >> 12) & 0x3f]);
                sb.append('=');
                sb.append('=');
                break;
        }
    }

    return sb.toString();
}

现在这就是我在 Swift 中所拥有的,我在 StringBuffer 和 java 示例中遇到了问题:

private static func getBase64(buffer : [UInt8]) {
    let map : Array<Character> = [
        "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", "+", "/"
    ]

    // String Buffer?

    for var i = 0; i < buffer.count; i++ {
        var b0 : UInt8 = buffer[i++]
        var b1 : UInt8 = 0
        var b2 : UInt8 = 0

        var bytes : Int = 3

        if i < buffer.count {
            b1 = buffer[i++]
            if i < buffer.count {
                b2 = buffer[i]
            } else {
                bytes = 2
            }
        } else {
            bytes = 1
        }

        let total : Int = Int((b0 << 16) | (b1 << 8) | b2)

        switch bytes
        {
        case 3:
            // not sure
            break
        case 2:
            // not sure
            break
        case 1:
            // not sure
            break
        }
    }
}

Swift 如何实现 StringBuffer 以及如何构建我的案例,就像 Java 代码在 swift 中所做的那样?任何帮助表示赞赏。

最佳答案

假设您真正需要的是一种将字符串与 Base64 相互转换的方法,这里有一个简单的方法:

import Foundation

extension String {
  func UTF8toBase64() -> String {
    let data = self.dataUsingEncoding(NSUTF8StringEncoding)
    return data?.base64EncodedStringWithOptions([]) ?? ""
  }

  func Base64toUTF8() -> String {
    let data = NSData.init(base64EncodedString: self, options: []) ?? NSData()
    return String(data: data, encoding: NSUTF8StringEncoding) ?? ""
  }
}

let string = "Test"
let string64 = string.UTF8toBase64() // => "VGVzdA=="
let string2 = string64.Base64toUTF8() // => "Test

当然,这始终假定为 UTF-8,您可能希望允许其他编码。

关于java - UInt8 数组到 Base64 字符串 Swift(包括 Java 示例),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35589579/

相关文章:

java - 我应该使用哪个 Apple Push Notification Service Java 库?

ios - 从 CloudKit 获取并保存到 CoreData

swift - 界面 : do { } in Swift

linux - 如何在 bash 中转换文本文件? (foo.txt 到 bar.txt)

unicode - 这个字符分隔符是什么:^ _?

c - 如何用C语言将单个位写入文件

java - Struts2 中什么时候真正需要自定义 validator ?

java - OCJP 转储线程同步方法

java - 系统如何显示tomcat内存?

ios - 快速内存管理