微信小程序码createQRCode、getUnlimited返回的图片的二进制buffer数据怎么转换成图片

在微信小程序的API开发文档中,提供了两个函数方法,那就是wx.base64ToArrayBuffer和wx.arrayBufferToBase64,这两个方法是用来将base64编码和二进制Buffer编码进行互转的,我们在利用fs来写本地文件的时候,写入的就是二进制编码,所以有的时候就需要将base64处理成buffer。

const base64 = 'CxYh'
const arrayBuffer = wx.base64ToArrayBuffer(base64)

const arrayBuffer = new Uint8Array([11, 22, 33])
const base64 = wx.arrayBufferToBase64(arrayBuffer)

这是微信小程序提供的一个基础代码,那么我们如果是在使用nodejs时,该如何进行转换呢,这个时候就需要使用Buffer来进行处理。

我们知道createQRCode和getUnlimited都是微信提供的服务端调用接口,就是用来生成小程序码的,那么我们在使用HTTPS调用的时候,会返回一个二进制图片Buffer。这个是一个二进制,但是一个二进制字符串。

let bufferString = '';
let resBuffer = Buffer.from(bufferString,'binary')
fs.writeFileSync('./图片.jpg', Buffer.from(resBuffer,'binary'))

提到生成二进制Buffer,就需要使用Buffer.from方法,当在 Buffer 和字符串之间转换时,可以指定字符编码。 如果未指定字符编码,则使用 UTF-8 作为默认值。

  • 'utf8': 多字节编码的 Unicode 字符。 许多网页和其他文档格式都使用 UTF-8。 这是默认的字符编码。 当将 Buffer 解码为不专门包含有效 UTF-8 数据的字符串时,则会使用 Unicode 替换字符 U+FFFD � 来表示这些错误。

  • 'utf16le': 多字节编码的 Unicode 字符。 与 'utf8' 不同,字符串中的每个字符都会使用 2 个或 4 个字节进行编码。 Node.js 仅支持 UTF-16 的小端序变体。

  • 'latin1': Latin-1 代表 ISO-8859-1。 此字符编码仅支持从 U+0000 到 U+00FF 的 Unicode 字符。 每个字符使用单个字节进行编码。 超出该范围的字符会被截断,并映射成该范围内的字符。

使用以上方法之一将 Buffer 转换为字符串,称为解码;将字符串转换为 Buffer,称为编码。

Node.js 还支持以下两种二进制转文本的编码。 对于二进制转文本的编码,其命名约定是相反的:将 Buffer 转换为字符串通常称为编码,而将字符串转换为 Buffer 则称为解码。

  • 'base64': Base64 编码。 当从字符串创建 Buffer 时,此编码也会正确地接受 RFC 4648 第 5 节中指定的 “URL 和文件名安全字母”。 base64 编码的字符串中包含的空格字符(例如空格、制表符和换行)会被忽略。

  • 'hex': 将每个字节编码成两个十六进制的字符。 当解码仅包含有效的十六进制字符的字符串时,可能会发生数据截断。 请参见下面的示例。

还支持以下传统的字符编码:

  • 'ascii': 仅适用于 7 位 ASCII 数据。 当将字符串编码为 Buffer 时,这等效于使用 'latin1'。 当将 Buffer 解码为字符串时,则使用此编码会在解码为 'latin1' 之前额外取消设置每个字节的最高位。 通常,当在编码或解码纯 ASCII 文本时,应该没有理由使用这种编码,因为 'utf8'(或者,如果已知的数据始终为纯 ASCII,则为 'latin1')会是更好的选择。 这仅为传统的兼容性而提供。

  • 'binary': 'latin1' 的别名。 有关此编码的更多背景,请参阅二进制字符串。 该编码的名称可能会引起误解,因为此处列出的所有编码都是在字符串和二进制数据之间转换。 对于在字符串和 Buffer 之间进行转换,通常 'utf-8' 是正确的选择。

  • 'ucs2': 'utf16le' 的别名。 UCS-2 以前是指 UTF-16 的一种变体,该变体不支持代码点大于 U+FFFF 的字符。 在 Node.js 中,始终支持这些代码点。


关闭(Esc)