lihailan
lihailan
  • 发布:2020-11-26 16:51
  • 更新:2020-12-25 17:41
  • 阅读:1042

【报Bug】atob方法解码导致数据长度(头部)丢失

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Windows

PC开发环境操作系统版本号: 10

HBuilderX类型: Alpha

HBuilderX版本号: 2.9.11

手机系统: Android

手机系统版本号: Android 11

手机厂商: 小米

手机机型: mi 9 se

页面类型: vue

打包方式: 云端

项目创建方式: HBuilderX

操作步骤:

atob('H4sIi65WSs7JTM0r8SxQslIytDTSMzSzMDQyNFPSgUsYgWQMzYwNDI2MDA0skGSMccgE5BeVKFkZWlgYmOoo5STmZUINh5ldGwsA')

预期结果:

解析出效果报incorrect header check

实际结果:

[31, 65533, 8, 65533, 65533, 86, 74, 65533, 65533, 76, 65533, 43, 65533, 44, 80, 65533, 82, 50, 65533, 52, 65533, 51,
52, 65533, 48, 52, 50, 52, 83, 1153, 75, 24, 65533, 100, 12, 844, 13, 12, 65533, 65533, 12, 13, 44, 65533, 100, 65533,
113, 65533, 4, 65533, 23, 65533, 40, 89, 25, 90, 88, 24, 65533, 65533, 40, 65533, 36, 65533, 101, 66, 13, 65533, 65533,
93, 27, 11, 0
]

bug描述:

APP atob('H4sIi65WSs7JTM0r8SxQslIytDTSMzSzMDQyNFPSgUsYgWQMzYwNDI2MDA0skGSMccgE5BeVKFkZWlgYmOoo5STmZUINh5ldGwsA') 手机端解析长度73,报错 。h5正常解析长度76

2020-11-26 16:51 负责人:DCloud_Android_DQQ 分享
已邀请:

最佳回复

DCloud_Android_DQQ

DCloud_Android_DQQ

问题已确认。 下一版本修复

触发条件需要同时满足:
1 V8 引擎,runtime value转 js value时默认采用的UTF-8
2 atob,传入的数据包含非标准base64字符。

DCloud_Android_DQQ

DCloud_Android_DQQ

我这里用chrome 执行得到的结果是这个。 你那里转换时正常的吗

  • lihailan (作者)

    chrome可以执行,手机端 到pako报错,发现是atob转出来丢失了数据

    2020-11-30 10:00

lihailan

lihailan (作者) - xue

是的,是这样的,这个还需要转换
var strDataTemp=atob('H4sIi65WSs7JTM0r8SxQslIytDTSMzSzMDQyNFPSgUsYgWQMzYwNDI2MDA0skGSMccgE5BeVKFkZWlgYmOoo5STmZUINh5ldGwsA')
let charData = strDataTemp.split('').map(function(x) { return x.charCodeAt(0) });
var sReturn = pako.inflate(new Uint8Array(charData), {
to: 'string'
});

lihailan

lihailan (作者) - xue

帮忙看下

DCloud_Android_DQQ

DCloud_Android_DQQ

我这边用你发的代码测试,在H5/Android/ios 平台都提示错误。

你提供一个可以复现问题的demo

  • lihailan (作者)

    已经发了demo了。

    2020-12-07 11:32

lihailan

lihailan (作者) - xue

var strDataTemp = atob('H4sIi65WSs7JTM0r8SxQslIytDTSMzSzMDQyNFPSgUsYgWQMzYwNDI2MDA0skGSMccgE5BeVKFkZWlgYmOoo5STmZUINh5ldGwsA');
let charData = strDataTemp.split('').map(function(x) { return x.charCodeAt(0) });
var sReturn = pako.inflate(new Uint8Array(charData), {
to: 'string'
});
console.log(sReturn);

lihailan

lihailan (作者) - xue

要添加pako.js

DCloud_Android_DQQ

DCloud_Android_DQQ

有添加。你提供一个可复现问题的demo吧

lihailan

lihailan (作者) - xue

DCloud_Android_DQQ

DCloud_Android_DQQ

DCloud_Android_DQQ

HX版本 3.0.0 bug已修复

  • 3***@qq.com

    3.0.5.20210107 版本又发现该问题

    2021-01-16 15:52

  • DCloud_Android_DQQ

    回复 3***@qq.com: 贴一下可以复现问题的demo

    2021-01-16 17:25

  • 3***@qq.com

    回复 DCloud_Android_DQQ: data:application/dat;base64,EooBCkQIARJACAgQNBoCrwEgACgAMAA4lNwHQiQIAxIgyCazJ1eoSewjpJyWH675MT5aICOnZ8A1y04eULg5XHRIAFIECAESABAAGkCJEmStGfFunnIh94pH/peMTIbrLoluZpVCCw0JQLe+tSOsDYxLJ1u1OnLF/4ZosFDt+H6TKNTOfj3gu0cSAA2a

    就这个 用安卓的atob解析出来和ios解析出来 转换成Uint8Array 长度不一致 安卓140 ios141

    2021-01-18 10:07

  • DCloud_Android_DQQ

    回复 3***@qq.com: 贴一下 可以复现问题的代码

    2021-01-18 10:25

  • 3***@qq.com

    回复 DCloud_Android_DQQ: base64ToUint8Array(base64String) {

    const BASE64_MARKER = ';base64,';

         const base64Index = base64String.indexOf(BASE64_MARKER) + BASE64_MARKER.length;

    const base64 = base64String.substring(base64Index);

    let rawData = atob(base64);

    const outputArray = new Uint8Array(rawData.length);

    for (let i = 0; i < rawData.length; ++i) {

    outputArray[i] = rawData.charCodeAt(i);

    }

    return outputArray.buffer;

    }

    2021-01-18 11:42

  • DCloud_Android_DQQ

    回复 3***@qq.com: 如果你要报问题,新开一个帖子,提供一个能体现出你问题的完整代码示例。

    不要让我猜。 你这样一会贴一段不完整的代码,我是没办法理解的。

    2021-01-18 11:57

该问题目前已经被锁定, 无法添加新回复