GVKun编程网logo

Python base 36编码(python编码大全)

9

此处将为大家介绍关于Pythonbase36编码的详细内容,并且为您解答有关python编码大全的相关问题,此外,我们还将为您介绍关于Base系列编码浅析【base16base32base64base

此处将为大家介绍关于Python base 36编码的详细内容,并且为您解答有关python编码大全的相关问题,此外,我们还将为您介绍关于Base系列编码浅析【base16 base32 base64 base85 base36 base 58 base91 base 92 base62】、Hbase基础(二十一):python操作hbase之happybase、java – Base36编码一个字符串?、Python Base64编码的有用信息。

本文目录一览:

Python base 36编码(python编码大全)

Python base 36编码(python编码大全)

如何在Python中以36为底的整数进行编码,然后再次对其进行解码?

答案1

小编典典

您是否尝试过Wikipedia的示例代码?

def base36encode(number, alphabet=''0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ''):    """Converts an integer to a base36 string."""    if not isinstance(number, (int, long)):        raise TypeError(''number must be an integer'')    base36 = ''''    sign = ''''    if number < 0:        sign = ''-''        number = -number    if 0 <= number < len(alphabet):        return sign + alphabet[number]    while number != 0:        number, i = divmod(number, len(alphabet))        base36 = alphabet[i] + base36    return sign + base36def base36decode(number):    return int(number, 36)print base36encode(1412823931503067241)print base36decode(''AQF8AA0006EH'')

Base系列编码浅析【base16 base32 base64 base85 base36 base 58 base91 base 92 base62】

Base系列编码浅析【base16 base32 base64 base85 base36 base 58 base91 base 92 base62】

Base系列编码浅析

 
 
Base编码有很多种,常用的有:
            base16   base32   base64   base85  base36  base 58  base91  base 92   base62
 

 

Base16

  •   使用16个ASCII可打印字符(数字0-9和字母A-F),对任意字节数据进行编码。
  •      先获取输入字符串每个字节的二进制值(不足8比特在高位补0),然后将其串联进来,再按照4比特一组进行切分,将每组二进制数分别转换成十进制。
  •   Base16编码后的数据量是原数据的两倍:1000比特数据需要250个字符(即 250*8=2000 比特)。
 
                                    
 
:可以看到8比特数据按照4比特切分刚好是两组,所以Base16不可能用到填充符号“=”。
  换句话说:Base16使用两个ASCII字符去编码原数据中的一个字节数据。
  Base16编码是一个标准的十六进制字符串(注意是字符串而不是数值),更易被人类和计算机使用,因为它并不包含任何控制字符,以及Base64和Base32中的“=”符号。
 
 

 
 

Base32

 
  •    Base32编码是使用32个可打印字符(字母A-Z和数字2-7)对任意字节数据进行编码的方案,编码后的字符串不用区分大小写并排除了容易混淆的字符,可以方便地由人类使用并由计算机处理。
  •    Base32主要用于编码二进制数据,但是Base32也能够编码诸如ASCII之类的二进制文本。
  •    Base32将任意字符串按照字节进行切分,并将每个字节对应的二进制值(不足8比特高位补0)串联起来,按照5比特一组进行切分,并将每组二进制值转换成十进制来对应32个可打印字符中的一个。
 
 
 
 
 
  由于数据的二进制传输是按照8比特一组进行(即一个字节),因此Base32按5比特切分的二进制数据必须是40比特的倍数(5和8的最小公倍数)。
 
  例如输入单字节字符“%”,它对应的二进制值是“100101”,前面补两个0变成“00100101”(二进制值不足8比特的都要在高位加0直到8比特),从左侧开始按照5比特切分成两组:“00100”和“101”,后一组不足5比特,则在末尾填充0直到5比特,变成“00100”和“10100”,这两组二进制数分别转换成十进制数,通过上述表格即可找到其对应的可打印字符“E”和“U”,但是这里只用到两组共10比特,还差30比特达到40比特,按照5比特一组还需6组,则在末尾填充6个“=”。填充“=”符号的作用是方便一些程序的标准化运行,大多数情况下不添加也无关紧要,而且,在URL中使用时必须去掉“=”符号。
 

 

Base64

  •     Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于,所以每6个比特为一个单元,对应某个可打印字符。3个字节有24个比特,对应于4个Base64单元,即3个字节可由4个可打印字符来表示。
  •    在Base64中的可打印字符包括字母A-Z、a-z、数字0-9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同。一些如uuencode的其他编码方法。
  •    它可用来作为电子邮件的传输编码。
  •     Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据,包括MIME的电子邮件及XML的一些复杂数据。
 
 
 
   注:BinHex的版本使用不同的64字符集来代表6个二进制数字,但是不被称为Base64。
 
 
 
  如果要编码的字节数不能被3整除,最后会多出1个或2个字节,那么可以使用下面的方法进行处理:
 
    (1)先使用0字节值在末尾补足,使其能够被3整除,然后再进行Base64的编码。
       (2)在编码后的Base64文本后加上一个或两个=号,代表补足的字节数。
 
  也就是说:
    当最后剩余两个八位(待补足)字节(2个byte)时,最后一个6位的Base64字节块有四位是0值,最后附加上两个等号;
    如果最后剩余一个八位(待补足)字节(1个byte)时,最后一个6位的base字节块有两位是0值,最后附加一个等号。 
 
参考下表:
 
 
 
 

 
 
 

Base85

  •         base85 也称为Ascii85,是Paul E. Rutter为btoa实用程序开发的一种二进制文本编码形式。通过使用五个ASCII字符来表示四个字节的二进制数据(使编码量1 / 4比原来大,假设每ASCII字符8个比特),它比更有效UUENCODE或Base64的,它使用四个字符来表示三个字节的数据(1 / 3的增加,假设每ASCII字符8个比特)。
  •         用途是Adobe的PostScript和Portable Document Format文件格式,以及Git使用的二进制文件的补丁编码。
  •         与Base64一样,Base85编码的目标是对二进制数据可打印的ASCII字符进行编码。但是它使用了更大的字符集,因此效率更高一些。具体来说,它可以用5个字符编码4个字节(32位)。
 
摘自wiki介绍的一个例子:
 
 
 

 
 
 

Base36

 
 
Base36是一个二进制到文本编码表示方案的二进制数据以ASCII通过将其转化为一个字符串格式基数 -36表示。选择36十分方便,因为可以使用阿拉伯数字 0–9和拉丁字母 A–Z [1](ISO基本拉丁字母)表示数字。
每个base36位需要少于6位的信息来表示。
 
摘自wiki的一个例子:
 
有符号的32位和64位整数分别最多只能容纳6个或13个base-36位数字(许多base-36位数字可能会使32位和64位整数溢出)。
 
例如,在base-36中,“ 922337203685477575807 ” 的64位带符号整数最大值为“ 1Y2P0IJ32E8E7 ”。
类似地,在base-36中,“ 2147483647 ” 的32位带符号整数最大值为“ ZIK0ZJ ”。
 
(这里没看太懂是怎么转换的,请大佬指教~)
 
用于从BASE10编码BASE36的Python代码
 
def base36encode(integer): 
    chars = ''0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'' 
    
     sign = ''-'' if integer < 0 else '''' 
     integer = abs(integer) 
     result = '''' 
 
     while integer > 0: 
         integer, remainder = divmod(integer, 36) 
         result = chars[remainder]+result
 
      return sign+result

 

 
 
 

 

Base58

 
  •         Base58是用于Bitcoin中使用的一种独特的编码方式,主要用于产生Bitcoin的钱包地址。
  •         相比Base64,Base58不使用数字"0",字母大写"O",字母大写"I",和字母小写"l",以及"+"和"/"符号
  
  设计Base58主要的目的是:
  1. 避免混淆。在某些字体下,数字0和字母大写O,以及字母大写I和字母小写l会非常相似。
  2. 不使用"+"和"/"的原因是非字母或数字的字符串作为帐号较难被接受。
  3. 没有标点符号,通常不会被从中间分行。
  4. 大部分的软件支持双击选择整个字符串。
 
 
 
 

 
 
 

Base91

 
  顾名思义,basE91需要91个字符来表示ASCII编码的二进制数据。 从94个可打印ASCII字符(0x21-0x7E)中,以下三个字符被省略以构建basE91字母:
 
    -(破折号,0x2D)
    \(反斜杠,0x5C)
    ''(撇号,0x27)
  •     basE91是将二进制数据编码为ASCII字符的高级方法。 
  •     它类似于UUencode或base64,但效率更高。 basE91产生的开销取决于输入数据。 它的数量最多为23%(而base64为33%),范围可以降低到14%,通常发生在0字节块上。 
  •     这使得basE91对于通过二进制不安全连接(例如电子邮件或终端线)传输较大的文件非常有用。
 
 
 
转换表由其余字符组成,如下所示。
 
 

 
 

Base92

 
 
  有关Base92的资料实在是很少,但是笔者找到了这一篇博客:
 
    https://thenoviceoof.com/blog/projects/base92/
 
以下介绍均摘自这篇博客

 

  “  如果您对将二进制信息从一个地方转移到另一地方一无所知,那么就知道将数据从一个地方转移到另一地方 可能很危险。就是说,这对您的数据有害:也许您需要在仅用于ASCII文本的通道上传输Blob ,并且所有''\n''以C样式字符串表示的字节都会突然有一个同级符号''\r''。或者,您的传输层实际上真的真的是以null终止的字符串,并且您恰好在字节边界上连续有8个连续的0位,即使它位于blob中一个32位整数的中间,并且你结束了只有一半您的数据。
 
  解决此问题的一种方法是使用base64,它使用所有数字和大写/小写字母字符对数据进行编码(再加上两个,但现在我们将忽略它们)。现在,您在传输层上尝试解释您的字节时没有任何问题,因为每个人都可以很好地处理字母数字字符,如果没有,您可能不想使用它们。
当然,使用base64了一段时间后,您可能会注意到,虽然您不会因为一位反复无常的上帝以为他在提供帮助,却没有按照自己的意愿对数据进行更改,但您却通过使用放弃了效率base64。对于二进制blob中的每3个字节,如果需要传输字母数字字符,则有4个字节,因此您要以33%的容量税来支付数据保护费用:如果暴徒可以在保护球拍中掠走33%,相信他们会的。
  看一下base64,您可能会注意到,除了可以使用的64个字符外,还有更多可显示的ASCII字符,base64可以在编码中使用这些字符以提高传输密度。这样就base85诞生了,使用了……您猜对了,有85个字符!这次,将4字节的二进制数据编码为5个ASCII字符,这将导致20%的传输大小开销。但你能做什么呢?好像没有更多可显示的ASCII了……哦,等等。
 
  所以似乎没有人试图超越明显的下一步base85,所以我决定尝试自己做base92。
 
  在键入编码的字符串时,`和“与普通引号''太相似,以使其舒适。希望在区分l / 1和0 / O时使用的字体好。但是,我们将〜用作特殊符号(空字符串)。有94个可打印的ascii字符,因此我们最终得到91个字符,或每个字符6.5位。一旦包含〜,则将有92个字符:因此,为base92。(老实说,base91的名字太丑陋了,无法处理)
  一旦每个字符有6.5位,则可以一次使用13位,并使用类似于base85的除法和取模方案,用它们产生两个输出字符。这可能意味着,与base92编码相比,它更能抵抗损坏,因为任何损坏都更加局限(一位更改仅影响2-3个字节,而不影响4个字节)。
 
 
注意:在某些需要某些输出的情况下,可能需要将〜用作空字符串分号:但是,传递空字符串进行解码不会导致它变成barf,因此不要求使用〜。
旁注:以前base92产生的输出的长度与输入的长度非单调增长。这已不再是这种情况。
另一个旁注:base64和base85更加优雅,将一个较小的字节整数干净地映射到另一个较小的字节整数。base92将13个字节映射为16个字符,从大小的角度来看,这比base85的4至5个字符更好,但是相当不雅观。我们还遵循使用高除数乘积作为第一个字节的base85约定。”
 
 
 
以上是笔者用谷歌翻译直接搬运的,如有描述不懂的小伙伴,请参照原文链接进行参考~
 

 
 

Base62

 
 
  • Base62编码将数字转换为ASCII字符串(0-9,az和AZ),反之亦然,这通常会导致字符串较短。
               26个小写字母+26个大写字母+10个数字=62
 
 
(1)62进制与10进制的互相转化
 
  •   62进制转10进制与2进制转10进制相似。
        2进制转10进制过程为: 从右到左用二进制的每个数去乘以2的相应次方,次方要从0开始。
        62进制转10进制也类似,从右往左每个数*62的N次方,N从0开始。
 
 
 
  那么,10进制转62进制也与10进制转2进制类似。  即:不断除以62取余数,然后倒序。
 
 
(2)关于短Url的转换
 
    主要思路,维护一个全局自增的id,每来一个长url,将其与一个自增id绑定,然后利用base62将该自增id转换为base62字符串,即完成转换。

 
 
 
 
 以上就是对Base系列编码的浅析,部分知识是笔者从wiki上搬运过来的,也参考了很多博客文章和资料。如有错误及不足之处,请大佬们多提建议~
 
 
 
 
 
 
参考资料:
 
 
https://en.wikipedia.org/wiki
 
https://blog.csdn.net/n0nameforn0w/article/details/87124053
 
https://thenoviceoof.com/blog/projects/base92/
 
https://segmentfault.com/a/1190000010516708
 
 
 
 
 
 

Hbase基础(二十一):python操作hbase之happybase

Hbase基础(二十一):python操作hbase之happybase

来源:https://blog.csdn.net/qq_43279457/article/details/109137470

happybase官方文档:https://happybase.readthedocs.io/en/latest/api.html#

0 hbase准备

0.1 使用happybase库操作hbase
先安装该库 pip install happybase

0.2 然后确保 hadoop 和 hbase 可用并开启
能进行hdfs操作就代表hadoop正常运行
能在 hbase shell 下使用 list 命令并不报错就代表能正常运行
0.3 开启thrift
使用命令开启

$HBASE_HOME/bin/hbase-daemon.sh start thrift

使用命令 jps 查看是否开启成功

1 连接hbase

  1. 连接操作
import happybase

con = happybase.Connection('192.168.31.105')
con.open()  # 打开传输
print(con.tables())  # 输出所有表名
con.close()  # 关闭传输

进入Connection对象中,左边列出了许多Connection对象中可以操作的函数,这些函数能在表级上操作表,如创建表,禁用表,删除表(hbase中要先禁用表后才能删除表),创建表对象等

 

 其中最常用的是创建表对象,table函数就是创建表对象,定位到table函数这里,发现他返回的是Table()对象,继续跟进Table对象

 

 左边是Table对象下的函数,里边有查看单元格,查看列,删除数据,创建数据等。

2 表操作

2.1 创建表

import happybase

con = happybase.Connection('192.168.31.105')  # 默认9090端口
con.open()  # 打开thrift传输,TCP连接

families = {
    'wangzherongyao': dict(max_versions=2),  # 设置最大版本为2
    'hepingjingying': dict(max_versions=1, block_cache_enabled=False),
    'xiaoxiaole': dict(),  # 使用默认值.版本默认为3
}
con.create_table('games', families)  # games是表名,families是列簇,列簇使用字典的形式表示,每个列簇要添加配置选项,配置选项也要用字典表示

print(con.tables())

配置选项:

max_versions (int类型)
compression (str类型)
in_memory (bool类型)
bloom_filter_type (str类型)
bloom_filter_vector_size (int类型)
bloom_filter_nb_hashes (int类型)
block_cache_enabled (bool类型)
time_to_live (int类型)

2.2 启动或禁用表

要设置或者删除表时,必须得先禁用表,再删除。只能禁用或启动一次,不能重复,否则报错。

# 禁用表
import happybase

con = happybase.Connection('192.168.31.105')  # 默认9090端口
con.open()  # 打开thrift传输,TCP连接

con.disable_table('games')  # 禁用表,games代表表名
print(con.is_table_enabled('games'))  # 查看表的状态,False代表禁用,True代表启动
print(con.tables())  # 即使禁用了该表,该表还是存在的,只是状态改变了

con.close()  # 关闭传输

 

# 启动表
import happybase

con = happybase.Connection('192.168.31.105')  # 默认9090端口
con.open()  # 打开thrift传输,TCP连接

con.enable_table('games')  # 启动该表
print(con.is_table_enabled('games'))  # 查看表的状态,False代表禁用,True代表启动
print(con.tables())  # 即使禁用了该表,该表还是存在的,只是状态改变了

con.close()  # 关闭传输

 

2.3 删除表

删除一个表要先将该表禁用,之后才能删除。下面的delete_table函数不但可以禁用表还可以删除表。如果前面已经禁用了该表,delete_table函数就可以不用加第二个参数,默认为False

import happybase

con = happybase.Connection('192.168.31.105')  # 默认9090端口
con.open()  # 打开thrift传输,TCP连接

con.delete_table('games', disable=True)  # 第一个参数表名,第二个参数表示是否禁用该表

print(con.tables())

 

3.数据操作

3.1 建立数据

这里向单元格写一个数据。

注意:如果写数据时没有这个列名,就新建这样的列名,再写数据。

在 hbase shell 中,使用put命令,一次只能写入一个单元格,而happybase库的put函数能写入多个。

import happybase

con = happybase.Connection('192.168.31.105')  # 默认9090端口
con.open()  # 打开传输

biao = con.table('games')  # games是表名,table('games')获取某一个表对象

wangzhe = {
    'wangzherongyao:名字': '别出大辅助',
    'wangzherongyao:等级': '30',
    'wangzherongyao:段位': '最强王者',
}
biao.put('0001', wangzhe)  # 提交数据,0001代表行键,写入的数据要使用字典形式表示

# 下面是查看信息,如果不懂可以继续看下一个
one_row = biao.row('0001')  # 获取一行数据,0001是行键
for value in one_row.keys():  # 遍历字典
    print(value.decode('utf-8'), one_row[value].decode('utf-8'))  # 可能有中文,使用encode转码

con.close()  # 关闭传输

3.2 查看操作

下面连接之后,就创建一个表对象,然后对这个表对象进行操作,这里演示了多种查看操作,第一个是查看一行的数据,第二个是查看一个单元格的数据,因为我存储时使用了中文,在hbase中存储的不是中文,而是utf-8的编码,这里接收了hbase传过来的编码数据之后对它进行解码,第三个是获取多行的数据,第四个是使用扫描器获取整个表的数据。

import happybase

con = happybase.Connection('192.168.31.105')  # 默认9090端口
con.open()  # 打开传输

biao = con.table('games')  # games是表名,table('games')获取某一个表对象

print('-----------------------第一个-----------------------------')
one_row = biao.row('0001')  # 获取一行数据,0001是行键
for value in one_row.keys():  # 遍历字典
    print(value.decode('utf-8'), one_row[value].decode('utf-8'))  # 可能有中文,使用encode内置函数转码

print('-----------------------第二个-----------------------------')
print(biao.cells('0001', 'wangzherongyao:段位')[0].decode('utf-8'))  # 获取一个单元格信息,返回列表,转码输出,0001是行键,wangzherongyao是列簇名,是列名

print('-----------------------第三个-----------------------------')
for key, value in biao.rows(['0001', '0002']):  # 获取多行的数据,列表或元组中可以写入多个行键
    # print(key, '<=====>', value)  # 由于0002我没有写入数据,就查不到,也不返回信息
    for index in value.keys():  # 遍历字典
        print(key.decode('utf-8'), index.decode('utf-8'), value[index].decode('utf-8'))  # 可能有中文,使用encode转码

print('-----------------------第四个----------------------------')
for rowkey, liecu in biao.scan():  # 获取扫描器对象,该对象是可迭代对象。扫描器记录了一个表的结构
    # print(rowkey, '<=====>', liecu)
    for index in liecu.keys():  # 遍历字典
        print(rowkey.decode('utf-8'), index.decode('utf-8'), liecu[index].decode('utf-8'))  # 可能有中文,使用encode转码

con.close()  # 关闭传输

以上四种方法都支持添加时间戳选项查看数据

3.3 删除数据

import happybase

con = happybase.Connection('192.168.31.105')  # 默认9090端口
con.open()  # 打开传输

biao = con.table('games')  # games是表名,table('games')获取某一个表对象

biao.delete('0003', ['wangzherongyao:段位'])  # 删除一个单元格信息
# biao.delete('0003', ['wangzherongyao:名字', 'wangzherongyao:等级'])  # 删除多个单元个信息
# biao.delete('0003', ['wangzherongyao'])  # 删除一列簇信息
# biao.delete('0003')  # 删除一整行信息

# 查看数据,看看是否还在
for rowkey, liecu in biao.scan():  # 获取扫描器对象,该对象是可迭代对象。扫描器记录了一个表的结构
    # print(rowkey, '<=====>', liecu)
    for index in liecu.keys():  # 遍历字典
        print(rowkey.decode('utf-8'), index.decode('utf-8'), liecu[index].decode('utf-8'))  # 可能有中文,使用encode转码
con.close()  # 关闭传输

前面说过,删除是根据时间戳来删除最近的版本,再次查看时显示的下一个时间戳最近的版本,那么下面测试一下是不是这样。

import happybase

con = happybase.Connection('192.168.31.105')  # 默认9090端口
con.open()  # 打开传输

biao = con.table('games')  # games是表名,table('games')获取某一个表对象
biao.put('0001', {'wangzherongyao:段位': '最强王者'})
biao.put('0001', {'wangzherongyao:段位': '永恒钻石V'})
biao.put('0001', {'wangzherongyao:段位': '尊贵铂金I'})  # 重复写三个值
print(biao.cells('0001', 'wangzherongyao:段位'))  # 查看单元格的数据显示为最后一个时间戳的版本,即尊贵铂金I

biao.delete('0001', ['wangzherongyao:段位'])  # 删除单元格的信息,按照正常的理论查看时显示永恒钻石V
print(biao.cells('0001', 'wangzherongyao:段位'))  # 查看单元格的信息,显示为空

con.close()  # 关闭传输

很奇怪,答案错误,他把里面的东西都删了,那么问题出现在哪里? 看 hbase shell 下是操作怎样的

 

 按照 hbase shell 的操作,理论上是没错的,那么问题出现在哪里?问题出现在 deleteall 操作

可以猜测出,happybase库的 delete 函数封装的是 hbase shell 中的 deleteall 函数,所以调用要delete函数时要谨慎

 

3.4 批处理

batch()函数可以创建一个可执行对象,然后在进行批处理操作,其实该函数返回了Batch对象,Batch对象支持上下文管理协议,可以执行批量写put操作、批量删delete操作,然后还要使用发送send函数提交到服务器,个人感觉比较鸡肋。其实上面讲的delete函数就是调用了这里的delete函数

 

java – Base36编码一个字符串?

java – Base36编码一个字符串?

我一直在网上寻找,但无法找到解决方案.在Python,Ruby或Java中,我如何基于36编码以下字符串:norG9Eh0uyeilM8Nnu5pTywj3935kW 5 =

解决方法:

ruby

以36为基础:

s.unpack('H*')[0].to_i(16).to_s 36

从36号基地:

[s36.to_i(36).to_s(16)].pack 'H*'

Python Base64编码

Python Base64编码

Base64编码

  • base64.b64encode(s[altchars]

  • base64.urlsafe_b64encode(s)

  This allows an application to e.g. generate URL or filesystem safe Base64 strings

由于标准的Base64编码后可能出现字符+/ 而在URL中就不能直接作为参数

所以"url safe"的urlsafe_b64encode编码,就把字符+/分别变成-

base64.b64encode(''i\xb7\x1d\xfb\xef\xff'')
''abcd++//''
base64.urlsafe_b64encode(''i\xb7\x1d\xfb\xef\xff'')
''abcd--__''

由于=字符也可能出现在Base64编码中,但=用在URL、Cookie里面会造成歧义,因此,很多Base64编码后会把=去掉

python 3中转码的方式

base64.urlsafe_b64encode(bytes(‘str’, "utf-8")  


今天碰到的一个问题:

    如何对一个数据结构 进行base64编码?

        方法: json.dumps()    把一种数据结构转成 字符串类型。

        然后再对使用 base64.编码


今天关于Python base 36编码python编码大全的分享就到这里,希望大家有所收获,若想了解更多关于Base系列编码浅析【base16 base32 base64 base85 base36 base 58 base91 base 92 base62】、Hbase基础(二十一):python操作hbase之happybase、java – Base36编码一个字符串?、Python Base64编码等相关知识,可以在本站进行查询。

本文标签: