javascript:下载的文件大小与内容长度不同

javascript:下载的文件大小与内容长度不同,javascript,html,google-chrome,Javascript,Html,Google Chrome,我解码了一个base64字符串,希望允许用户将其保存为文件。特别是,当我检查decodedContent的长度时,它是11271字节 var content = messageObj['data']; var decodedContent = atob(content); console.log(decodedContent.length); 然后我用 var blob = new Blob([decodedContent], {type: 'application/octet-strea

我解码了一个base64字符串,希望允许用户将其保存为文件。特别是,当我检查decodedContent的长度时,它是11271字节

  var content = messageObj['data'];
var decodedContent = atob(content);
console.log(decodedContent.length);
然后我用

var blob = new Blob([decodedContent], {type: 'application/octet-stream'});
window.open((window.URL || window.webkitURL).createObjectURL(blob));
提示用户保存
decodedContent
。当我检查保存的文件大小时,它显示16892字节,这与上面所述的不同。知道为什么吗

内容是从服务器发送的base64编码tar-ball文件

for i ,l in enumerate(to_download):
            if i == 1:
                break
            last_index = l.rfind('|')
            download_path = l[last_index+1:].strip()
            mda_url = '%s/%s'%(root_url, download_path)

            logger.debug('Downloading file %s/%s at %s', i, len(to_download), mda_url)

            mda_req = urllib2.Request(mda_url)
            mda_response = urllib2.urlopen(mda_req)
            f = StringIO.StringIO(mda_response.read())

            replace_path = mda_url.replace('/', '_')
            ti = TarInfo("%s.txt" %replace_path)
            ti.size = f.len

            tar.addfile(ti, f)

        tar.close()
        tar_file.close()

        with open("/Users/carrier24sg/Desktop/my.tar", 'rb') as f:
            tar_str = f.read()
        logger.info("Completed downloading all the requested files..")



    return tar_str
更新

缩小到var
decodedContent=atob(content)
的问题;或者
var blob=new blob([decodedContent],{type:'application/octet stream'})


最后,我设法使用了@Jeremy Bank的答案。他的第一个答案解决了内容长度不同的问题,但当我检查校验和时,内容似乎不符。只有使用他的第二个答案的函数b64toBlob,我才能解决这个问题。但是,我仍然不确定这里出了什么问题,所以我希望有人能对此有所帮助。

我认为问题在于atomb()返回了该文件的基本base64版本。当您询问它的大小时,它将返回它包含的字节

当您从base64变量创建一个blob并询问其大小时,它将返回它将在您的计算机上填充多少空间


这两件事是不同的,因为文件存储大小和编码大小不是一回事。它们在不同的平台上也不同。

blob.size
显示了什么?blob.size表示16892Ok,你能举一个例子说明
解码内容中的内容吗?一种解释是,
atob
产生包含多字节字符的字符串。例如,
var p=atob('ddd');var b=新Blob([p],{type:'application/octet stream'});控制台日志(b.大小);/*3*/console.log(p.length);/*2*/
@raina77ow,它是从服务器端发送的base64编码的tarball文件。我发布了我使用的python代码段。base64编码是在服务器端还是客户端完成的?它可能是前者,否则你不必解码;不过,澄清这一点还是不错的。我的猜测是,整个机制的某些部分将源材料视为一个字符串,而它实际上是一个字节序列(反之亦然)。