0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

鸿蒙二进制数组创建

王程 来源:jf_75796907 作者:jf_75796907 2024-01-31 15:24 次阅读

背景

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

    文章

    8053

    浏览量

    149403
  • 鸿蒙
    +关注

    关注

    55

    文章

    2257

    浏览量

    42345
  • HarmonyOS
    +关注

    关注

    79

    文章

    1941

    浏览量

    29587
收藏 人收藏

    评论

    相关推荐

    二进制显示数组

    请教各位大神如何将一个十进制数组变成二进制显示??我是初学者,在数组属性里的显示格式里,二进制不可选,是不是需要数据转换???请各位大神不吝
    发表于 11-28 11:21

    二进制相对调相(二进制差分调相2DPSK)的工作原理

    二进制相对调相(二进制差分调相2DPSK)的工作原理
    发表于 10-21 13:01 3154次阅读
    <b class='flag-5'>二进制</b>相对调相(<b class='flag-5'>二进制</b>差分调相2DPSK)的工作原理

    二进制

    二进制   二进制与十进制的区别在于数码的个数和进位规律有很大的区别,顾名思义,二进制的计数规律为逢二进一,是以2为基数的计数体制。10这
    发表于 04-06 23:48 7921次阅读
    <b class='flag-5'>二进制</b>

    二进制变化彩灯

    二进制变化彩灯
    发表于 04-09 17:52 1341次阅读
    <b class='flag-5'>二进制</b>变化彩灯

    C语言入门教程-二进制文件

    二进制文件 二进制文件非常类似于结构体数组,只不过这些结构体被保存在一个磁盘文件而非内存数组中。因为是使用磁盘保存二进制文件中的结构体,所
    发表于 07-29 14:24 1898次阅读

    二进制时钟电路

    二进制时钟电路
    发表于 09-11 11:22 3072次阅读
    <b class='flag-5'>二进制</b>时钟电路

    同步二进制计数器

    同步二进制计数器 1.   同步与异步二进制加法计数器比较态序表和工作波形一样电路结构不同:  异步二进制加法
    发表于 09-30 18:37 1.2w次阅读
    同步<b class='flag-5'>二进制</b>计数器

    二进制编码和二进制数据

    二进制编码和二进制数据   二进制编码是计算机内使用最多的码制,它只使用两个基本符号"0"和"1",并且通过由这两个符号组成的
    发表于 10-13 16:22 4633次阅读

    什么是二进制计数器,二进制计数器原理是什么?

    什么是二进制计数器,二进制计数器原理是什么? 计数器是数字系统中用得较多的基本逻辑器件。它不仅能记录输入时钟脉冲的个数,还可以实现
    发表于 03-08 13:16 3.1w次阅读

    二进制电平,什么是二进制电平

    二进制电平,什么是二进制电平 在二进制数字通信系统中,每个码元或每个符号只能是“1”和“0”两个状态之一。若将每个码元可能取的状态增
    发表于 03-17 16:51 2310次阅读

    进制数的二进制编码

    进制数的二进制编码     在人机交互过程中,为了既满足系统中使用二进制数的要求,又适应人们使用十进制数的习惯
    发表于 05-02 19:04 9365次阅读

    二进制加法程序【汇编版】

    二进制加法程序【汇编版】二进制加法程序【汇编版】二进制加法程序【汇编版】二进制加法程序【汇编版】
    发表于 12-29 11:02 0次下载

    二进制加法程序【C语言版】

    二进制加法程序【C语言版】二进制加法程序【C语言版】二进制加法程序【C语言版】二进制加法程序【C语言版】
    发表于 12-29 11:03 0次下载

    LabVIEW二进制数组转换二进制字符串的详细资料免费下载

    本文档的主要内容详细介绍的是LabVIEW二进制数组转换二进制字符串的详细资料免费下载,需要的下载吧。
    发表于 11-29 08:00 16次下载
    LabVIEW<b class='flag-5'>二进制</b><b class='flag-5'>数组</b>转换<b class='flag-5'>二进制</b>字符串的详细资料免费下载

    LabVIEW数值数组转换二进制字符串的详细资料概述

    本文档的主要内容详细介绍的是LabVIEW数值数组转换二进制字符串的详细资料免费下载,需要的下载吧。
    发表于 11-29 08:00 60次下载
    LabVIEW数值<b class='flag-5'>数组</b>转换<b class='flag-5'>二进制</b>字符串的详细资料概述