背景
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;
审核编辑 黄宇
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
接口
+关注
关注
33文章
7639浏览量
148494 -
鸿蒙
+关注
关注
55文章
1629浏览量
42119 -
HarmonyOS
+关注
关注
79文章
1833浏览量
29261
发布评论请先 登录
相关推荐
二进制格雷码与自然二进制码的互换
。而绝对式编码器是直接输出数字量的传感器,它是利用自然二进制或循环二进制(格雷码)方式进行光电转换的,编码的设计一般是采用自然二进制码、循环二进制码、
发表于 03-08 14:16
labview中的二进制存储
我想把一个15000个点的一位数组存储为二进制文件,但是不知道是存储的速率不够还是其他什么原因,存储后我再读取只有5000个点。程序如图所示。请高人指点啊,我不知道二进制存储的速率到底是多大,是不是存储速率不够还是怎么的
发表于 03-03 09:31
关于Labview中二进制文件的读写
在LABVIEW中使用二进制读写节点时,遇到一个奇怪的问题,当我通过新建文件创建二进制文件(见第一张图),之后将数据写入到二进制文件中(见第二
发表于 09-30 15:03
如何理解二进制运算规则 二进制是如何运算的
二进制运算规则二进制的运算算术运算二进制的加法:0+0=0,0+1=1 ,1+0=1, 1+1=10(向高位进位);二进制的减法:0-0=0,10-1=1(向高位借位) 1-0=1,1
发表于 12-11 17:49
如何丢弃函数的二进制代码填入SRAM的二进制代码?
应用程序 : 示例代码演示了如何丢弃函数的二进制代码, 然后填入 SRAM 的二进制代码, 然后调用它 。
BSP版本:M451系列BSP V3.01.001
硬件: 任何 M451 系列板块
发表于 08-23 06:34
C语言入门教程-二进制文件
二进制文件
二进制文件非常类似于结构体数组,只不过这些结构体被保存在一个磁盘文件而非内存数组中。因为是使用磁盘保存二进制文件中的结构体,所
发表于 07-29 14:24
•1869次阅读
二进制电平,什么是二进制电平
二进制电平,什么是二进制电平
在二进制数字通信系统中,每个码元或每个符号只能是“1”和“0”两个状态之一。若将每个码元可能取的状态增
发表于 03-17 16:51
•2271次阅读
LabVIEW二进制数组转换二进制字符串的详细资料免费下载
本文档的主要内容详细介绍的是LabVIEW二进制数组转换二进制字符串的详细资料免费下载,需要的下载吧。
发表于 11-29 08:00
•16次下载
评论