我正在创建一个移动的(iOS)应用程序,它与esp32通信,并将此信息存储在数据库中(我使用Firebase). esp32发送一个字节数组到我的手机后,我把这些字节在一个uint16数组,使他们可以上传到firebase作为一个blob.从esp32的传输工作完美,上传的字节工作完美时,运行我的脚本在我的但是当我尝试从手机上传一些字节时,我得到的是一个实际值为字符的文件,而不是一个原始数据编码为二进制的文件。我认为我的问题与爱马仕将uint16数组视为dict而不是实际数组有关,因为当我在Xcode终端中记录数组而不是获取实际数组时,我得到了以下结果:
{ '0': 30789, '1': 23107 }
字符串
我用来创建数组和发送数据的代码如下:
//the base64String is already decoded at an earlier stage
concatTypedArrays(base64String) {
//Create Uint16Array from data
const byteArr = new Uint16Array(base64String.length/2);
for (let i = 0; i < base64String.length; i+=2) {
const highByte = base64String.charCodeAt(i) << 8;
const lowByte = base64String.charCodeAt(i + 1);
byteArr[i / 2] = highByte | lowByte;
}
//Append array
let c = new Uint16Array(this.arr.length + byteArr.length);
c.set(this.arr, 0);
c.set(byteArr, this.arr.length);
this.arr = c
console.log(this.arr)
}
async function uploadBlob(bytes){
const newByteRef = doc(collection(db, "PPG"));
const url = 'PPG/'+newByteRef.id
const storageRef = ref(storage, url);
const U8bytes = new Uint8Array(bytes.buffer)
console.log(U8bytes)
try{
await uploadBytes(storageRef, U8bytes)
const downloadUrl = await getDownloadURL(storageRef)
console.log(downloadUrl);
const data = {
date:Date.now(),
url:downloadUrl.split("/").slice(-1)[0]
}
await setDoc(newByteRef,data)
} catch (error){
console.log(error)
}
}
型
在我的手机上运行时的输出文件:69,120,67,90
(12字节文件)
在我的计算机上运行时的输出文件:二进制文件(4字节文件)
任何建议或其他方式,我可以完成同样的任务,创建和上传一个blob到firebase将不胜感激。
编辑:我发现了一个更简单的方法来复制错误
const base64String = "eEU="
const storageRef = ref(storage, url);
uploadString(storageRef,base64String,'base64')
型
当运行这个节点没有问题,但与爱马仕有。
1条答案
按热度按时间ni65a41a1#
经过无数个小时的尝试,我终于在2019年的GitHub帖子中找到了流浪者:https://github.com/firebase/firebase-js-sdk/issues/576#issuecomment-533221157
这个问题显然是与react-native中Blob的实现有关,删除这个类可以解决这个问题。
字符串