6

我正在使用 GitHub API 从 GitHub 下载文件。我已经能够成功地进行身份验证并从 github 获得响应,并看到一个表示文件内容的 base64 编码字符串。

不幸的是,在解码 base64 字符串时出现异常错误(字符串长度不是 4 的倍数)。

HTTP 请求如下图所示:

GET /repos/:owner/:repo/contents/:path

(部分)响应如下所示:

{
    "name":....,
    "download_url":...",
    "type":"file",
    "content":"ewogICAgInN3YWdnZXIiOiAiM...
}

我遇到的问题是字符串的长度是15263字节,解码字符串时出错(字符串长度不是4的倍数)。我正在使用 node.js 和 'base64-js' npm 模块来解码字符串。执行解码的代码如下图所示:

var base64 = require('base64-js');
var contents = base64.toByteArray(fileContent);

解码导致异常:

Error: Invalid string. Length must be a multiple of 4
    at placeHoldersCount (.../node_modules/base64-js/index.js:23:11)
    at Object.toByteArray (...node_modules/base64-js/index.js:42:18)
    :
    :

我认为 GitHub API 正在向我发送正确的数据,所以我认为这不是问题。

我是在不正确地执行解码还是我忽略了另一个问题?

任何帮助表示赞赏。

4

3 回答 3

14

我进行了一些实验,并通过使用不同的 base64 解码库找到了解决方案,如下所示:

var base64 = require('js-base64').Base64;
var contents = base64.decode(res.content);

我不确定是否必须使编码字符串长度可被 4 整除(显然我的 15263 字符长度字符串不能被 4 整除)但备用库正确解码了字符串。

我还发现第二个可行的解决方案是特定于如何使用 GitHub API。通过将以下内容添加到 GitHub API 调用标头中,我还能够获取解码后的文件内容:

'accept': 'application/vnd.github.VERSION.raw'
于 2016-11-23T19:08:58.987 回答
9

经过大量试验,我想我确定了工作和损坏的 base64 解码之间的区别。

看起来 GitHub Base-64 编码为:

  • UTF-8 字符集
  • Base 64 MIME 编码器 (RFC2045)

与“基本”(RFC4648)Base64 编码器相反。几种语言似乎默认使用基本编码器(包括我使用的 Java)。当我切换到 MIME 编码器时,我得到了文件的全部内容,没有乱码。这可以解释为什么在某些情况下切换库可以解决问题。

我会注意到内容字段包含换行符 - 解码器应该忽略它们,但并非所有人都这样做,所以如果你仍然得到错误,你可能需要尝试删除它们。

媒体类型标头会更好地完成这项工作,但是在我的情况下,我正在尝试通过 GitHub 应用程序使用 API - 在撰写本文时,GitHub 要求在执行此操作时使用特定的媒体类型,并且它返回 JSON 响应.

于 2019-01-22T06:36:26.253 回答
0

由于某种原因,我从谷歌首页尝试过的所有在线 base64 解码器都无法正确解码 Github API 的 base64 编码内容。

然而,Python 可以工作:

import base64
base64.b64decode("ewogICAgInN3YWdnZXIiOiAiM...")
于 2018-02-28T19:12:03.040 回答