使用爱马仕JavaScript引擎时,uint数组的行为不同

wqsoz72f  于 2023-11-15  发布在  Java
关注(0)|答案(1)|浏览(95)

我正在创建一个移动的(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')


当运行这个节点没有问题,但与爱马仕有。

ni65a41a

ni65a41a1#

经过无数个小时的尝试,我终于在2019年的GitHub帖子中找到了流浪者:https://github.com/firebase/firebase-js-sdk/issues/576#issuecomment-533221157
这个问题显然是与react-native中Blob的实现有关,删除这个类可以解决这个问题。

import { decode } from 'base-64';

if(typeof atob === 'undefined') {
  global.atob = decode;
}

const Blob = global.Blob;
delete global.Blob;
uploadString(storageRef,base64String,'base64').then((snapshot) => {
  console.log('Uploaded a base64 string!');
  global.Blob = Blob;
});

字符串

相关问题