【问题标题】:Dart - Encode and decode base64 stringDart - 编码和解码 base64 字符串
【发布时间】:2013-02-07 15:58:16
【问题描述】:

如何原生转换 string -> base64base64 -> string

我只找到这个bytes to base64string

想要这样:

String Base64String.encode();
String Base64String.decode();

还是从其他语言移植更容易?

【问题讨论】:

    标签: dart


    【解决方案1】:

    截至crypto 软件包的 0.9.2

    CryptoUtils 已弃用。请改用dart:convert 中的Base64 API 和convert 包中的十六进制API。

    import 'dart:convert' show utf8, base64;
    
    main() {
      final str = 'https://dartpad.dartlang.org/';
    
      final encoded = base64.encode(UTF8.encode(str));
      print('base64: $encoded');
    
      final str2 = utf8.decode(base64.decode(encoded));
      print(str2);
      print(str == str2);
    }
    

    DartPad试试吧

    【讨论】:

      【解决方案2】:

      您可以使用转换库中的BASE64 codec(在 Dart 2 中重命名为 base64)和 LATIN1 codec(在 Dart 2 中重命名为 latin1)。

      var stringToEncode = 'Dart is awesome';
      
      // encoding
      
      var bytesInLatin1 = LATIN1.encode(stringToEncode);
      // [68, 97, 114, 116, 32, 105, 115, 32, 97, 119, 101, 115, 111, 109, 101]
      
      var base64encoded = BASE64.encode(bytesInLatin1);
      // RGFydCBpcyBhd2Vzb21l
      
      // decoding
      
      var bytesInLatin1_decoded = BASE64.decode(base64encoded);
      // [68, 97, 114, 116, 32, 105, 115, 32, 97, 119, 101, 115, 111, 109, 101]
      
      var initialValue = LATIN1.decode(bytesInLatin1_decoded);
      // Dart is awesome
      

      如果您始终使用LATIN1 来生成编码字符串,您可以通过创建编解码器直接将字符串转换为编码字符串/从编码字符串转换,从而避免两次转换调用。

      var codec = LATIN1.fuse(BASE64);
      
      print(codec.encode('Dart is awesome'));
      // RGFydCBpcyBhd2Vzb21l
      
      print(codec.decode('RGFydCBpcyBhd2Vzb21l'));
      // Dart is awesome
      

      【讨论】:

      • 这个 2013 年的答案现已弃用
      【解决方案3】:

      我会评论 Günter 2016 年 4 月 10 日的帖子,但我没有声誉。正如他所说,您现在应该使用dart:convert 库。您必须组合几个编解码器才能从 base64 字符串中获取 utf8 字符串,反之亦然。 This article 表示 fusing your codecs 更快。

      import 'dart:convert';
      
      void main() {
        var base64 = 'QXdlc29tZSE=';
        var utf8 = 'Awesome!';
      
        // Combining the codecs
        print(utf8 == UTF8.decode(BASE64.decode(base64)));
        print(base64 == BASE64.encode(UTF8.encode(utf8)));
        // Output:
        // true
        // true
      
        // Fusing is faster, and you don't have to worry about reversing your codecs
        print(utf8 == UTF8.fuse(BASE64).decode(base64));
        print(base64 == UTF8.fuse(BASE64).encode(utf8));
        // Output:
        // true
        // true
      }
      

      https://dartpad.dartlang.org/5c0e1cfb6d1d640cdc902fe57a2a687d

      【讨论】:

      • 为什么这没有内置到 dart:convert 库中?!
      • 它没有内置在转换库中,因为该库有很多不同的转换器、编码器和编解码器,并且同时拥有这些的所有组合将是矫枉过正。 fuse 操作在那里,因此您可以自己制作所需的组合。
      • 这对我不起作用,我的字符串是二进制的,我无法对其进行 utf8 解码
      • 如果您使用 DartPad 并且在使用长字符串变量 github.com/dart-lang/dart-pad/issues/… 呈现应用程序时遇到问题,我创建了此程序
      【解决方案4】:

      这里是一个在 dart 中编码/解码的例子:

      main.dart:

      import 'dart:convert';
      
      main() {
        // encode
        var str = "Hello world";
        var bytes = utf8.encode(str);
        var base64Str = base64.encode(bytes);
        print(base64Str);
      
        // decode
        var decoded_bytes = base64.decode(base64Str);
        var decoded_str = utf8.decode(decoded_bytes);
        print(decoded_str);
      }
      

      【讨论】:

        【解决方案5】:

        我拿了一个类 dart.io -> base64.dart,稍微修改了一下,就可以了

        使用方法:

        var somestring = 'Hello dart!';
        
        var base64string = Base64String.encode( somestring );
        var mystring = Base64String.decode( base64string );
        

        source on pastbin.com

        source on gist.github.com

        【讨论】:

          猜你喜欢
          • 2021-10-27
          • 1970-01-01
          • 2023-04-04
          • 1970-01-01
          • 2012-11-13
          • 2017-06-06
          • 1970-01-01
          相关资源
          最近更新 更多