首页 > 其他分享 >鸿蒙二进制数组创建

鸿蒙二进制数组创建

时间:2024-01-31 16:06:25浏览次数:32  
标签:eventTypeLen env 鸿蒙 二进制 data 数组 type napi

背景

c++层数据都是二进制,需要转换成arrayBuffer透传到ets层给业务使用,但是鸿蒙的使用下面两个api创建出来的二进制数组数据都是错误的。

接口

napi_create_arraybuffer: 这个接口只能创建空的二进制数组,没办法把char的内容丢进去创建 napi_create_external_arraybuffer: 这个接口支持创建二进制数组时候丢入初始化参数,但是如果你data是非unsigned char。你里面的数据就会转换错乱,导致二进制的数据无法再转换成正确的字符串

代码实例

错误的代码例子:

//接收ets传入的string字符串
char type[64] = {0};
size_t eventTypeLen = 0;
napi_get_value_string_utf8(env, args[0], type, sizeof(type), &eventTypeLen);

//错误的二进制数组写法
napi_value result1 = nullptr;
napi_create_external_arraybuffer(env, data, eventTypeLen, [](napi_env env, void *data, void *hint) {}, nullptr, &result1);
//这里返回的二进制数组到ets层,是无法正常转换回字符串的
return result1;

正确的代码例子:

//接收ets传入的string字符串
char type[64] = {0};
size_t eventTypeLen = 0;
napi_get_value_string_utf8(env, args[0], type, sizeof(type), &eventTypeLen);
//正确,把type转换成无符号的char*,然后作为参数传入就可以得到正确二进制流
unsigned char *arrayBuffer = new unsigned char[sizeof(type)];
//复制内容
memcpy(arrayBuffer, reinterpret_cast<unsigned char *>(type), sizeof(type));
napi_create_external_arraybuffer(
env, arrayBuffer, eventTypeLen, [](napi_env env, void *data, void *hint) {}, nullptr, &result1);
//这里返回的二进制数组到ets层,正常转换回字符串的
return result1;

创建方案二

1.方案二是创建一个空的arrayBuffer,然后给里面的data进行赋值,但是比较诡异我没想懂的是,napi_create_arraybuffer 的第三个参数data,并没有和第四个参数napi_value关联,但是修改data的值确能应该arrayBuffer的值

//napi_create_arraybuffer的源码
NAPI_EXTERN napi_status napi_create_arraybuffer(napi_env env, size_t byte_length, void** data, napi_value* result)
{
    NAPI_PREAMBLE(env);
    CHECK_ARG(env, data);
    CHECK_ARG(env, result);

    auto vm = reinterpret_cast<NativeEngine*>(env)->GetEcmaVm();
    uint8_t** values = (uint8_t**)(data);
    Local<panda::ArrayBufferRef> res = panda::ArrayBufferRef::New(vm, byte_length);
    if (values != nullptr) {
        *values = reinterpret_cast<uint8_t*>(res->GetBuffer());
    }
    *result = JsValueFromLocalValue(res);

    return GET_RETURN_STATUS(env);
}

2.第二种创建方法例子

//接收ets传入的string字符串
char type[64] = {0};
size_t eventTypeLen = 0;
napi_get_value_string_utf8(env, args[0], type, sizeof(type), &eventTypeLen);


    napi_value result2 = nullptr;
    void* data = nullptr;
    napi_create_arraybuffer(env, sizeof(type), &data, &result2);
    memcpy(data, type, sizeof(type));
    
    return result2;

标签:eventTypeLen,env,鸿蒙,二进制,data,数组,type,napi
From: https://blog.51cto.com/u_16536309/9511389

相关文章

  • el-form的对象数组数组校验
    el-form绑定的是一个对象,但在有些时候提交的表单中会有数组数据,校验有点不符合常理例如这样的一个表单,付款方是个数组,这种怎么校验呢。上代码用的循环el-form,:model绑定循环的item,也就是数组中的单个对象,然后prop绑定参数,rules正常写,然后提交的时候,因为el-form是循环的,所......
  • js中对数组的unshift是什么操作,为什么使用unshift进行命名?
    在JavaScript中,unshift()是数组对象的一个原生方法,它用于向数组的开头添加一个或多个元素,并将原有的数组元素依次向后移动。这个方法会改变原始数组本身,同时返回新的数组长度。在英语中,“unshift”不是一个标准的单词,但我们可以将其拆解为“un-”和“shift”。其中:“un-”是......
  • MySQL Shell 8.0.32 for GreatSQL编译二进制包
    MySQLShell8.0.32forGreatSQL编译二进制包构建MySQLShell8.0.32forGreatSQL0.写在前面之前已经写过一篇前传MySQLShell8.0.32forGreatSQL编译安装,最近再次编译MySQLShell二进制包时,发现了一些新问题,因此重新整理更新本文档。1.几处新问题这次编译MySQLShe......
  • useState返回的为什么是数组而不是对象?
    首先,const[count,setCount]=useState(0)这种语法是ES6的解构赋值语法。数组在解构赋值时,按照返回的顺序一一解构,并且可以重新命名:constfoo=[1,2,3]const[a,b,c]=foo//a=1,b=2,c=3而对象在解构赋值时,必须和useState函数内部返回的对象的key同名:constfood={......
  • 数组中重复的数据
    给定一个整数数组a,其中1≤a[i]≤n(n为数组长度),其中有些元素出现两次而其他元素出现一次。找到所有出现两次的元素。你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题吗?示例:输入:[4,3,2,7,8,2,3,1]输出:[2,3]publicList<Integer>findDuplicates(int[]......
  • 找到所有数组中消失的数字
    448.FindAllNumbersDisappearedinanArray(Easy)给定一个范围在1≤a[i]≤n(n=数组大小)的整型数组,数组中的元素一些出现了两次,另一些只出现一次。找到所有在[1,n]范围之间没有出现在数组中的数字。您能在不使用额外空间且时间复杂度为O(n)的情况下完成......
  • JAVA基础-数组
    数组(array)是一种容器,用来存储同种数据类型的多个值。总结:数组容器在存储数据的时候,需要结合数据类型考虑。例如:int类型的数组容器(booleanbyteshortdouble)建议:容器的类型,和存储的数据类型保持一致数组的定义格式⚫格式一:数据类型[]变量名⚫范例:int[]array⚫格......
  • C语言之二维数组的奥妙
    二维数组是什么二维数组是一个数组,数组的元素是数组type arr[N]={arr[M]};上图等价于typearr[N][M]N行M列数组,N和M都为整形常量 二维数组的存储方法如图是一个两行两列的二维数组,比如inta[2][2],在内存中是如何存储的采用的是蛇形的方法 二维数组的使用1#i......
  • VBA字节数组
    1SubreadArrByte()2DimstrPathAsString,ArByte()AsByte3DimintFileLenAsInteger4'配置路径、字节数组5strPath=ActivePresentation.Path'6strPath=strPath&"\"&"ByteFile-副本.txt"......
  • 鸿蒙OS和开源鸿蒙什么关系?
    开源鸿蒙(OpenHarmony)鸿蒙系统愿来的设计初衷,就是让所有设备都可以运行一个系统,但是每个设备的运算能力和功能都不同,所以内核的设计上,采用了微内核的设计,除了最基础的功能放在内核,其他功能都以模块的形式存在。华为用的是鸿蒙OS我们都知道,华为手机的鸿蒙OS是可以运行安卓软件的,是因......