首页 > 编程语言 >微信小程序 ArrayBuffer转16进制,16进制转字符串(解决中文乱码)

微信小程序 ArrayBuffer转16进制,16进制转字符串(解决中文乱码)

时间:2022-12-14 11:59:17浏览次数:78  
标签:进制 encoding ArrayBuffer 16 乱码 let 字符串

场景应用

微信小程序使用TCP通讯,接收数据的类型为ArrayBuffer,转字符串后中文乱码。(uniapp开发)

// 原本使用方法
// 拿到TCP通讯的 ArrayBuffer 数据
let unit8Arr = new Uint8Array(arrayBuffer)
let encodedString = String.fromCharCode.apply(null, unit8Arr)
let decodedString = decodeURIComponent(escape((encodedString)))
// decodeURIComponent()函数报错 "URI malformed"

准备

由于微信小程序是阉割版的Web,没有TextDecoder,需要去https://github.com/inexorabletash/text-encoding ,下载文件 encoding.js 和 encoding-indexes.js。

ArrayBuffer转16进制

function buf2hex(arrayBuffer) {
	return Array.prototype.map.call(new Uint8Array(arrayBuffer), x => ('00' + x.toString(16)).slice(-2)).join('');
}

16进制转字符串

/**
* 十六进制字符串转中文
* @param {String} hex 为十六进制字符串
* @return {String} 包含中文的字符串
*/
function hexToStr(hex) {
	// 去掉字符串首尾空格
	let trimedStr = hex.trim()
	// 判断trimedStr前两个字符是否为0x,如果是则截取从第三个字符及后面所有,否则返回全部字符
	let rawStr = trimedStr.substr(0, 2).toLowerCase() === "0x" ? trimedStr.substr(2) : trimedStr
	// 得到rawStr的长度
	let len = rawStr.length
	// 如果长度不能被2整除,那么传入的十六进制值有误,返回空字符
	if (len % 2 !== 0) {
		return ""
	}
	let curCharCode // 接收每次循环得到的字符
	let resultStr = [] // 存转换后的十进制值数组
	for (let i = 0; i < len; i = i + 2) {
		curCharCode = parseInt(rawStr.substr(i, 2), 16)
		resultStr.push(curCharCode)
	}
	// encoding为空时默认为utf-8
	let bytesView = new Uint8Array(resultStr) // 8 位无符号整数值的类型化数组
	// TextEncoder和TextDecoder对字符串和字节流互转  
	// let str = new TextDecoder(encoding).decode(bytesView)因为小程序中没有TextDecoder,经查阅资料,下载https://github.com/inexorabletash/text-encoding并const encoding = require("./text-encoding-master/lib/encoding.js")引入后使用下面方式即可:
	let str = new encoding.TextDecoder("gbk").decode(bytesView)
	return str
}

关键使用代码

import encoding from '@/xxx/encoding.js'	// 引入js

// 微信开放文档关键函数 TCPSocket.onMessage()
this.TCPClient.onMessage((res => {
	const arrayBuffer = res.message	// 获取通讯数据,类型为ArrayBuffer
	const data16 = buf2hex(arrayBuffer)	// ArrayBuffer转16进制
	const requestData = hexToStr(data16) // 16进制转字符串
	console.log(requestData)
}))

参考

小程序实现GBK编码数据转为Unicode/UTF8

微信小程序 JS 字符串string与utf8编码的arraybuffer的相互转换

标签:进制,encoding,ArrayBuffer,16,乱码,let,字符串
From: https://www.cnblogs.com/bugSource/p/16981653.html

相关文章

  • Android Studio Gradle编译输出信息乱码
    有时候AndroidStudioGradle编译时输出的信息是乱码,这是因为输出信息和信息的窗口不统一。首先,我们先修改设置里的文件编码Settings->Editor->FileEncodings打开都改......
  • ubuntu16 redis5.0以后版本集群部署示例
    简言1.redis5.0版本以前的集群部署是使用ruby脚本完成的,略为复杂,具体示例见笔者的这篇博客,​​ubuntu16redis5.0以前版本集群部署示例_YZF_Kevin的博客2.本篇博客讲解red......
  • ubuntu16 redis5.0以前版本集群部署示例
    简言1.redis5.0版本以前集群的部署是使用ruby脚本完成的,ruby脚本的安装少略麻烦(主要原因是系统自动安装的版本太低,无法部署集群,必须手动安装)2.redis5.0版本以后把集群的部......
  • Linux系统Word转换PDF,文档字体乱码不显示问题解决
    Linux系统Word转换PDF,文档字体乱码不显示问题解决1、在windows目录C:\Windows\Fonts下找到字体文件。2、在linux上寻找Linux/usr/share/fonts/my_fonts目录,如果没有......
  • leetcode-01背包-416背包子集问题
    因为每一个数字只能用一次,所以可以转化成01背包问题是从0到i-1这个区间内去寻找,时候否选择 nums[i] 是他们的和为 j-nums[i];具体推到如下:状态定义:dp[i][j]表示从数组的......
  • idea解决properties文件乱码问题
    properties文件中的转换到页面上直接乱码,看教程需要在jdk下启动native2ascii.exe进行转换再将转换出来的粘贴到文件中有些麻烦...如下代码块......
  • 通过ffmpeg将16k采样率的wav文件转换成采样率为8k的wav
    一安装win10的ffmpeg 二进入所在文件夹文件名字:temp.wavtrans_temp.pcmwav_name.wav先将wav转换成pcm文件ffmpeg-itemp.wav-acodecpcm_s16le-fs16l......
  • plsql 包 存储过程保存后,出现乱码问题
    这个问题是在一台新电脑上连接oracle连接plsql后,修改了包的逻辑编译保存后出现的问题。    一般的状况都是因为我们的包里边会有中文的注释。方便我们后期......
  • 二进制中1的个数
    输入一个 32 位整数,输出该数二进制表示中 1 的个数。classSolution{public:intlowbit(intx){returnx&-x;}intNumberOf1(ui......
  • Apache NetBeans 16 发布
    ApacheNetBeans16发布来源:OSCHINA编辑: Alias_Travis2022-12-1308:16:24 1ApacheNetBeans是顶级的Apache项目,是一个开源的开发环境、工具平台......