背景
c++層數(shù)據(jù)都是二進(jìn)制,需要轉(zhuǎn)換成arrayBuffer透?jìng)鞯絜ts層給業(yè)務(wù)使用,但是鴻蒙的使用下面兩個(gè)api創(chuàng)建出來(lái)的二進(jìn)制數(shù)組數(shù)據(jù)都是錯(cuò)誤的。
napi_create_arraybuffer: 這個(gè)接口只能創(chuàng)建空的二進(jìn)制數(shù)組,沒(méi)辦法把char的內(nèi)容丟進(jìn)去創(chuàng)建
napi_create_external_arraybuffer: 這個(gè)接口支持創(chuàng)建二進(jìn)制數(shù)組時(shí)候丟入初始化參數(shù),但是如果你data是非unsigned char。你里面的數(shù)據(jù)就會(huì)轉(zhuǎn)換錯(cuò)亂,導(dǎo)致二進(jìn)制的數(shù)據(jù)無(wú)法再轉(zhuǎn)換成正確的字符串
代碼實(shí)例
錯(cuò)誤的代碼例子:
//接收ets傳入的string字符串
char type[64] = {0};
size_t eventTypeLen = 0;
napi_get_value_string_utf8(env, args[0], type, sizeof(type), &eventTypeLen);
//錯(cuò)誤的二進(jìn)制數(shù)組寫法
napi_value result1 = nullptr;
napi_create_external_arraybuffer(env, data, eventTypeLen, [](napi_env env, void *data, void *hint) {}, nullptr, &result1);
//這里返回的二進(jìn)制數(shù)組到ets層,是無(wú)法正常轉(zhuǎn)換回字符串的
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轉(zhuǎn)換成無(wú)符號(hào)的char*,然后作為參數(shù)傳入就可以得到正確二進(jìn)制流
unsigned char *arrayBuffer = new unsigned char[sizeof(type)];
//復(fù)制內(nèi)容
memcpy(arrayBuffer, reinterpret_cast(type), sizeof(type));
napi_create_external_arraybuffer(
env, arrayBuffer, eventTypeLen, [](napi_env env, void *data, void *hint) {}, nullptr, &result1);
//這里返回的二進(jìn)制數(shù)組到ets層,正常轉(zhuǎn)換回字符串的
return result1;
創(chuàng)建方案二
1.方案二是創(chuàng)建一個(gè)空的arrayBuffer,然后給里面的data進(jìn)行賦值,但是比較詭異我沒(méi)想懂的是,napi_create_arraybuffer 的第三個(gè)參數(shù)data,并沒(méi)有和第四個(gè)參數(shù)napi_value關(guān)聯(lián),但是修改data的值確能應(yīng)該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(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.第二種創(chuàng)建方法例子
//接收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;
審核編輯 黃宇
-
接口
+關(guān)注
關(guān)注
33文章
9519瀏覽量
157020 -
鴻蒙
+關(guān)注
關(guān)注
60文章
2963瀏覽量
45883 -
HarmonyOS
+關(guān)注
關(guān)注
80文章
2153瀏覽量
36041
發(fā)布評(píng)論請(qǐng)先 登錄
如何使用Arduino和LED矩陣構(gòu)建簡(jiǎn)單的二進(jìn)制時(shí)鐘
二進(jìn)制顯示數(shù)組
二進(jìn)制相對(duì)調(diào)相(二進(jìn)制差分調(diào)相2DPSK)的工作原理
二進(jìn)制
C語(yǔ)言入門教程-二進(jìn)制文件
二進(jìn)制編碼和二進(jìn)制數(shù)據(jù)
什么是二進(jìn)制計(jì)數(shù)器,二進(jìn)制計(jì)數(shù)器原理是什么?
二進(jìn)制電平,什么是二進(jìn)制電平
十進(jìn)制數(shù)的二進(jìn)制編碼
二進(jìn)制加法程序【匯編版】
二進(jìn)制加法程序【C語(yǔ)言版】
LabVIEW二進(jìn)制數(shù)組轉(zhuǎn)換二進(jìn)制字符串的詳細(xì)資料免費(fèi)下載
LabVIEW數(shù)值數(shù)組轉(zhuǎn)換二進(jìn)制字符串的詳細(xì)資料概述
鴻蒙二進(jìn)制數(shù)組創(chuàng)建
評(píng)論