背景
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 typ服务器托管网e[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(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)
{
N服务器托管网API_PREAMBLE(env);
CHECK_ARG(env, data);
CHECK_ARG(env, result);
auto vm = reinterpret_cast(env)->GetEcmaVm();
uint8_t** values = (uint8_t**)(data);
Local res = panda::ArrayBufferRef::New(vm, byte_length);
if (values != nullptr) {
*values = reinterpret_cast(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;
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
相关推荐: SpringCloud微服务 【实用篇】| Eureka注册中心、Ribbon负载均衡
目录 一:Eureka注册中心 1. Eureka原理 2. 动手实践 ①搭建EurekaServer ②服务注册 ③服务发现 二:Ribbon负载均衡 1. 负载均衡原理 2.负载均衡策略 3. 懒加载 tips:前些天突然发现了一个巨牛的人工智能学习网站,…