Javascript 在Python中将base64数据解码为数组

Javascript 在Python中将base64数据解码为数组,javascript,python,arrays,base64,decode,Javascript,Python,Arrays,Base64,Decode,我使用这个方便的Javascript函数来解码base64字符串并得到一个数组作为回报 这是字符串: base64_decode_array('6gAAAOsAAADsAAAACAEAAAkBAAAKAQAAJgEAACcBAAAoAQAA') 这是返回的内容: 234,0,0,0,235,0,0,0,236,0,0,0,8,1,0,0,9,1,0,0,10,1,0,0,38,1,0,0,39,1,0,0,40,1,0,0 问题是我不太理解javascript函数: var base64ch

我使用这个方便的Javascript函数来解码base64字符串并得到一个数组作为回报

这是字符串:

base64_decode_array('6gAAAOsAAADsAAAACAEAAAkBAAAKAQAAJgEAACcBAAAoAQAA')
这是返回的内容:

234,0,0,0,235,0,0,0,236,0,0,0,8,1,0,0,9,1,0,0,10,1,0,0,38,1,0,0,39,1,0,0,40,1,0,0
问题是我不太理解javascript函数:

var base64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split("");
var base64inv = {}; 
for (var i = 0; i < base64chars.length; i++) { 
  base64inv[base64chars[i]] = i; 
}
function base64_decode_array (s)
{
  // remove/ignore any characters not in the base64 characters list
  //  or the pad character -- particularly newlines
  s = s.replace(new RegExp('[^'+base64chars.join("")+'=]', 'g'), "");

  // replace any incoming padding with a zero pad (the 'A' character is zero)
  var p = (s.charAt(s.length-1) == '=' ? 
          (s.charAt(s.length-2) == '=' ? 'AA' : 'A') : ""); 

  var r = [];

  s = s.substr(0, s.length - p.length) + p;

  // increment over the length of this encrypted string, four characters at a time
  for (var c = 0; c < s.length; c += 4) {

    // each of these four characters represents a 6-bit index in the base64 characters list
    //  which, when concatenated, will give the 24-bit number for the original 3 characters
    var n = (base64inv[s.charAt(c)] << 18) + (base64inv[s.charAt(c+1)] << 12) +
            (base64inv[s.charAt(c+2)] << 6) + base64inv[s.charAt(c+3)];


    // split the 24-bit number into the original three 8-bit (ASCII) characters
    r.push((n >>> 16) & 255);
    r.push((n >>> 8) & 255);
    r.push(n & 255);


  }
   // remove any zero pad that was added to make this a multiple of 24 bits
  return r;
}
var base64chars='abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxyz012456789+/'。拆分(“”);
var base64inv={};
对于(var i=0;i>>8)和255);
r、 推送(n&255);
}
//移除为使其成为24位的倍数而添加的任何零焊盘
返回r;
}
这些“”字符的功能是什么。
或者Python有这样的函数吗?

在Python中,我希望您只使用

。。。但是在回答您关于
的问题时:

  • 是无符号扩展右移运算符;结果是第一个操作数移位 按第二个操作数的位数右键。。。最左边的位总是用0填充

在Python中,我希望您只使用

。。。但是在回答您关于
的问题时:

  • 是无符号扩展右移运算符;结果是第一个操作数移位 按第二个操作数的位数右键。。。最左边的位总是用0填充
    • 为什么不:

      from binascii import a2b_base64, b2a_base64
      encoded_data = b2a_base64(some_string)
      decoded_string = a2b_base64(encoded_data)
      
      def base64_decode_array(string):
          return [ord(c) for c in a2b_base64(string)]
      
      为什么不只是:

      from binascii import a2b_base64, b2a_base64
      encoded_data = b2a_base64(some_string)
      decoded_string = a2b_base64(encoded_data)
      
      def base64_decode_array(string):
          return [ord(c) for c in a2b_base64(string)]
      

      谁在乎。Python有更简单的方法来做同样的事情

      [ord(c) for c in '6gAAAOsAAADsAAAACAEAAAkBAAAKAQAAJgEAACcBAAAoAQAA'.decode('base64')]
      

      谁在乎。Python有更简单的方法来做同样的事情

      [ord(c) for c in '6gAAAOsAAADsAAAACAEAAAkBAAAKAQAAJgEAACcBAAAoAQAA'.decode('base64')]
      

      为了好玩/完整,我将更准确地翻译javascript:)

      #没有特别的理由在这里列出字符而不是字符串。
      base64chars='ABCDEFGHIJKLMNOPQRSTUVWXYZABCDFGHIJKLMNOPQRSTUVWXYZ0123456789+/'
      查找=枚举(base64chars)中(i,c)的dict((c,i))
      def base64_解码_阵列:
      #过滤掉无意义的字符,尤其是换行符。不需要正则表达式。
      s=''.join(如果base64chars+'='中的c为s中的c)
      #将任何传入的填充替换为零填充(“a”字符为零)
      #他们的方式:
      #p=('AA'如果s[-2]='='else'A')如果s[-1]='='else''
      #s=s[:len(s)-len(p)]+p
      #我的方式(允许更多的填充;
      #“=”无论如何只会出现在末尾
      s=s.replace('=',A')
      r=[]
      #在4个字符的块中迭代字符串-一个难看的破解
      #尽管我们保留了原始代码的假设,即文本长度
      #是4的倍数(这就是“=”填充的含义)
      对于zip中的a、b、c、d(*[iter(s)]*4)):
      #将四元组中的每个字母转换为6位值并对其进行位移位
      #合并为24位值
      n=(查找[a]>8)和0xFF,(n和0xFF)]
      返回r
      
      为了好玩/完整,我将更准确地翻译javascript:)

      #没有特别的理由在这里列出字符而不是字符串。
      base64chars='ABCDEFGHIJKLMNOPQRSTUVWXYZABCDFGHIJKLMNOPQRSTUVWXYZ0123456789+/'
      查找=枚举(base64chars)中(i,c)的dict((c,i))
      def base64_解码_阵列:
      #过滤掉无意义的字符,尤其是换行符。不需要正则表达式。
      s=''.join(如果base64chars+'='中的c为s中的c)
      #将任何传入的填充替换为零填充(“a”字符为零)
      #他们的方式:
      #p=('AA'如果s[-2]='='else'A')如果s[-1]='='else''
      #s=s[:len(s)-len(p)]+p
      #我的方式(允许更多的填充;
      #“=”无论如何只会出现在末尾
      s=s.replace('=',A')
      r=[]
      #在4个字符的块中迭代字符串-一个难看的破解
      #尽管我们保留了原始代码的假设,即文本长度
      #是4的倍数(这就是“=”填充的含义)
      对于zip中的a、b、c、d(*[iter(s)]*4)):
      #将四元组中的每个字母转换为6位值并对其进行位移位
      #合并为24位值
      n=(查找[a]>8)和0xFF,(n和0xFF)]
      返回r
      
      好吧,我会被诅咒的。那太容易了,我会被诅咒的。太简单了,太棒了!我猜“4的倍数”是因为在解码后,你仍然需要每4个数字一起按位移位。有趣的是,除了变量名外,Python和Javascript中的代码行几乎完全相同:(Python:
      tentile=decodeData[i]| decodeData[i+1]是的,数学就是数学,查找就是查找。太棒了!我猜是“4的倍数”这是因为解码后,仍然需要每4个数字进行一次位移位。有趣的是,除了变量名外,Python和Javascript中的代码行几乎完全相同:(Python:
      tentile=decodeData[i]| decodeData[i+1]