V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
liuidetmks
V2EX  ›  程序员

怎么实现 buffer to base62

  •  
  •   liuidetmks · 2023-01-30 18:06:38 +08:00 · 1112 次点击
    这是一个创建于 655 天前的主题,其中的信息可能已经有所发展或是发生改变。

    搜了下,大部分是都是数字 uint64 to base62

    没有 buffer to base62 的,( buffer 可能很大,几十上百 k 甚至 M )

    通过栈溢出 找到一篇 string to base62

    但是他好像就是 用 9A 9B 9C 代表 62 63 64 ,这应该不算是 base62 吧

    11 条回复    2023-01-31 12:18:49 +08:00
    Nazz
        1
    Nazz  
       2023-01-30 18:10:35 +08:00
    为什么不用 base64
    ysc3839
        2
    ysc3839  
       2023-01-30 18:16:52 +08:00 via Android
    啥语言?
    liuidetmks
        3
    liuidetmks  
    OP
       2023-01-30 18:20:30 +08:00
    @ysc3839 随便什么语言吧,伪代码就行
    ysc3839
        4
    ysc3839  
       2023-01-30 18:28:10 +08:00 via Android
    @liuidetmks 那照着 base64 或者 base58 的代码改改就好了呀,原理是相通的
    tool2d
        5
    tool2d  
       2023-01-30 18:33:50 +08:00


    我写的算法,用来压缩中文文件名的,只支持了 250 左右长度的 buffer 字符串压缩。

    你可以修改一下,只要大数计算类支持,可以支持几 K 长度 buffer 。你几兆长度,切分一下就是了。
    liuidetmks
        6
    liuidetmks  
    OP
       2023-01-31 09:43:25 +08:00
    @ysc3839 原理不相通啊,64 正好是 6bit ,可以直接一一对应,62 不是 2^n , 需要做除法,如果一个 buffer 有 10M ,对 10M 长度大数做除法,可能有些问题


    @tool2d 你这个是把 buffer 按照 2048 切分,然后拼接字符串吗, 接受方也要按照这个方式切片才能识别
    (而不是把整个 buffer 作为大数)
    tool2d
        7
    tool2d  
       2023-01-31 10:20:14 +08:00
    @liuidetmks "而不是把整个 buffer 作为大数", 当然可以啊。

    我只是说贴出来的代码是有精度判断。

    任何语言的大数类,只要你内存够大,大数长度都是没有限制的,随便你设置多少。
    liuidetmks
        8
    liuidetmks  
    OP
       2023-01-31 10:23:07 +08:00
    @tool2d 好吧,看来没有一个简单的方法可以完成 base62,必须引入大数类做除法
    iqoo
        9
    iqoo  
       2023-01-31 11:49:30 +08:00
    用 9A 9B 9C 代表 62 63 64 就是转义的思路,实现最简单,可直接复用 base64 模块,但效率会略低点。

    整个 buffer 做大数编码效率最高,但开销大。

    按一定长度切开做大数,编码效率和开销大之间做平衡。
    ysc3839
        10
    ysc3839  
       2023-01-31 11:51:45 +08:00 via Android
    @liuidetmks 多谢指正,那 base58 呢?
    vvhy
        11
    vvhy  
       2023-01-31 12:18:49 +08:00 via Android
    刚刚看了一篇 base58 的文章,不知道是否有帮助 https://wyhaines.io/base58-what-is-it-why-use-it
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2752 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 05:34 · PVG 13:34 · LAX 21:34 · JFK 00:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.