具体代码为:
uni.request({
url:"",
method:"GET",
dataType:"arraybuffer",
responseType:"arraybuffer", // 一定要设置为二进制的模式
success:(res)=>{
}
});
其中服务器传输回来的是一个流文件,我在网页上调试没有问题,在安卓上,拿到的数据还是以String模式呈现的,这样我就没法解析了。有什么办法解决?
具体代码为:
uni.request({
url:"",
method:"GET",
dataType:"arraybuffer",
responseType:"arraybuffer", // 一定要设置为二进制的模式
success:(res)=>{
}
});
其中服务器传输回来的是一个流文件,我在网页上调试没有问题,在安卓上,拿到的数据还是以String模式呈现的,这样我就没法解析了。有什么办法解决?
最佳回复
已确认在app中有问题 可以先尝试通过下面的方法来解决
var StreamBinaryString = function(s) {
this._p = 0;
this._s = this.fromBinaryString(s);
};
StreamBinaryString.prototype = {
constructor: StreamBinaryString,
fromBinaryString(e) {
var t = e || '';
var f = [];
for (var i = 0; i < t.length; i++) {
f[i] = String.fromCharCode(t.charCodeAt(i) & 255);
}
return f.join('');
},
read: function(array, offset, count) {
if (arguments.length == 1) {
var result = this._s.substr(this._p, array);
this._p += array;
return result;
} else {
var result = 0;
for (var i = 0; i < count; i++) {
array[i] = this._s.charCodeAt(this._p);
this._p += 1;
result++;
}
return result;
}
},
readByte: function() {
var result = this._s.charCodeAt(this._p);
this._p += 1;
return result;
},
readInt8: function(signed) {
var result = this._s.charCodeAt(this._p);
if (signed && result > 127) {
result -= 256;
}
this._p += 1;
return result;
},
readInt16: function() {
var result = ((this._s.charCodeAt(this._p) << 8) + this._s.charCodeAt(this._p + 1));
this._p += 2;
return result;
},
readInt32: function() {
var result = ((this._s.charCodeAt(this._p) << 24) + (this._s.charCodeAt(this._p + 1) << 16) + (this._s.charCodeAt(
this._p + 2) << 8) + this._s.charCodeAt(this._p + 3));
this._p += 4;
return result;
},
eof: function() {
return this._p >= this._s.length;
}
};
示例
uni.request({
url: "https://dcloud.io/html5video/xiangeiailisi3.mid",
method: "GET",
dataType: "arraybuffer",
responseType: "arraybuffer",
success: (res) => {
var stream = new StreamBinaryString(res.data);
console.log("readByte: " + stream.readByte());
console.log("readByte: " + stream.readByte());
console.log("readByte: " + stream.readByte());
console.log("readByte: " + stream.readByte());
}
});
回复 4***@qq.com: 同问一下,您是怎么最后解决的,我也是请求图片,转成base64的,今天发现h5+app不能用responsetype
2019-07-28 17:22
Bug已修复,更新 HBuilderX
字符串示例
uni.request({
url: "https://www.dcloud.io",
responseType: "arrayBuffer",
success: (res) => {
var dv = new DataView(res.data);
var bufferLength = dv.byteLength;
var result = '';
for (var i = 0; i < bufferLength; i++) {
result += String.fromCharCode(dv.getInt8(i))
}
console.log(result);
}
})
二进制文件示例
uni.request({
url: "https://dcloud.io/html5video/xiangeiailisi3.mid",
method: "GET",
responseType: "arraybuffer",
success: (res) => {
var dv = new DataView(res.data);
// M T h d
for (var i = 0; i <= 3; i++) {
console.log(String.fromCharCode(dv.getInt8(i)));
}
// 0 0 0 6 0 1 0 2
for (var i = 4; i <= 11; i++) {
console.log(dv.getInt8(i));
}
// M t r k
for (var i = 14; i <= 18; i++) {
console.log(String.fromCharCode(dv.getInt8(i)));
}
}
});
String模式的,你 JSON.parse 一下应该就可以了
DylanJi (作者)
关键问题是我传输的内容不是String模式的,是二进制流模式的,如果转换成String的话,就全部乱了。我是要拿到本地后,用bytearray来解析的
2019-03-01 16:40
我试了一下bug依旧在,没有被修复。android下返回的依旧是字符串
@DCloud_UNI_HDX
HBuilderX 2.2.1 已修复,测试代码
uni.request({
url: "https://dcloud.io/html5video/xiangeiailisi3.mid",
method: "GET",
responseType: "arraybuffer",
success: (res) => {
var dv = new DataView(res.data);
// M T h d
for (var i = 0; i <= 3; i++) {
console.log(String.fromCharCode(dv.getInt8(i)));
}
// 0 0 0 6 0 1 0 2
for (var i = 4; i <= 11; i++) {
console.log(dv.getInt8(i));
}
// M t r k
for (var i = 14; i <= 18; i++) {
console.log(String.fromCharCode(dv.getInt8(i)));
}
}
});
DylanJi (作者)
感谢您的回复,请问下readInt8的函数中,参数 t 是什么?我在使用的时候该传什么值进去?
2019-04-02 20:51
DCloud_uni-ad_HDX
回复 DylanJi:已修改代码,看上去比较好理解些了,int8与uint8的区别
2019-04-03 10:35
DylanJi (作者)
回复 DCloud_uni-ad_HDX:感谢您的回复,不过还是有问题,我自己试了下,如果传过来的数据里Array里面,数值大于127的话,好像charCodeAt返回的值就成了65533这样很大的数值。还是希望可以尽快修复这个bug
2019-04-03 12:34
DCloud_uni-ad_HDX
回复 DylanJi:我上面补充了一个函数,先转下试试
2019-04-03 12:56
DylanJi (作者)
回复 DCloud_uni-ad_HDX:好的,感谢
2019-04-04 10:38
4***@qq.com
你好 有没有示例。我也遇到这个问题了,需要把二进制流转成arraybuffer
2019-04-12 12:25