HarmonyOS 鸿蒙Next Native侧和ArkTS相互传递带特殊字符的 buf
HarmonyOS 鸿蒙Next Native侧和ArkTS相互传递带特殊字符的 buf
各位大神:
我目前有一个项目,主题是将自己原始的so库逻辑迁移到鸿蒙平台,so库的主题是【文件及字符串的加解密】,采用对称加密算法,加密算法中存在这样的一个场景:50个字符长度的串,加密之后还是50个字符长度,在C语言中是可以解密过来的,但是有时候加密的结果中可能存在第30个字符为‘\0’或者其他特殊字符的情况,在指定长度的情况下C语言解密也没有问题,这个时候如何将这样的特殊字符串跟ArkTS测相互传递并保证数据的不丢失。
参考这个例子:
native层:
// NAPI层 array 传到TS层
static napi_value NAPI2TS(napi_env env, napi_callback_info info)
{
// 数据个数
int num = 20;
// 创建output_buffer
napi_value output_buffer;
void *output_ptr = NULL;
napi_create_arraybuffer(env, num * sizeof(int32_t), &output_ptr, &output_buffer);
<span class="hljs-comment">// output_array</span>
napi_value output_array;
napi_create_typedarray(env, napi_int32_array, num, output_buffer, <span class="hljs-number">0</span>, &output_array);
<span class="hljs-comment">// 给output_ptr、output_buffer赋值</span>
int32_t * output_bytes = (int32_t *)output_ptr;
<span class="hljs-keyword">for</span> (int32_t i = <span class="hljs-number">0</span>; i < num; i++) {
<span class="hljs-keyword">if</span> (i == <span class="hljs-number">10</span>) {
output_bytes[i] = <span class="hljs-string">'\0'</span>;
} <span class="hljs-keyword">else</span> {
output_bytes[i] = i;
}
}
<span class="hljs-keyword">for</span> (int32_t i = <span class="hljs-number">0</span>; i < num; i++) {
OH_LOG_INFO(LOG_APP, <span class="hljs-string">"Test NAPI NAPI2TS: C++ %{public}d"</span>, *((int32_t *)(output_ptr) + i));
}
<span class="hljs-keyword">return</span> output_array;
}
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>
// Index.d.ts
export const napi2ts: () => Array<number>;
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>
返回到arkts使用
hilog.info(0x0000, ‘testTag’, 'Test NAPI nap2ts: ’ + testNapi.napi2ts().toString());
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>
打印结果:
作为number看是能够将buffer里面的无损传过来的
你好,我这边目前用这个方式暂时还没有实现出来,我可以具体下我的数据场景:
调用处: let deststr2 :string = testNapi.OH_EnBuffer(deststr1); console.log("xxx2 “+ deststr2 +” deststr2.length = " + deststr2.length)
声明处: export const OH_EnBuffer: (srcstr: string) => string;
{“OH_EnBuffer”, nullptr, NAPI_EnBuffer, nullptr, nullptr, nullptr, napi_default, nullptr},
函数定义: static napi_value NAPI_EnBuffer(napi_env env, napi_callback_info info) { size_t argc = 1; napi_value args[1] = {nullptr};
napi_get_cb_info(env, info, &argc, args , nullptr, nullptr);
size_t len1 = 0;
napi_get_value_string_utf8(env, args[0], nullptr, 0, &len1); // 获取字符串长度到len
char *value0 = new char[len1 + 1]; // 分配合适大小的char数组
napi_get_value_string_utf8(env, args[0], value0, len1 + 1, &len1); // 获取字符串
int tt = EnBuffer((CHAR *)value0, (unsigned long long)0, (unsigned long)len1,(UCHAR *)"xxxxxxxxxxxxxxxx",2);//调用C语言 so库的EnBuffer 函数
if(tt)
{
printf("jiami File successed!");
OH_LOG_INFO(LOG_APP,"MY_TAG zwh value0: %{public}s",value0);
OH_LOG_INFO(LOG_APP,"MY_TAG zwh len1: %{public}d",len1);
OH_LOG_INFO(LOG_APP,"MY_TAG zwh value0.length: %{public}d",strlen(value0));
}
else
{
printf("jiami File Failed!");
}
napi_value contents;
napi_create_string_utf8(env, value0, len1, &contents);
return contents;
}
目前我的数据类型跟您描述的有点区别,源码如上,希望大佬能够指教一下,多谢
试了下没啥问题,确认下是不是你的so里面的函数出来的字符串是否有啥问题?: static napi_value NAPI_EnBuffer(napi_env env, napi_callback_info info) { size_t argc = 1; napi_value args[1] = {nullptr};
napi_get_cb_info(env, info, &argc, args , nullptr, nullptr);
size_t len1 = 0;
napi_get_value_string_utf8(env, args[0], nullptr, 0, &len1); // 获取字符串长度到len
char *value0 = new char[len1 + 1]; // 分配合适大小的char数组
napi_get_value_string_utf8(env, args[0], value0, len1 + 1, &len1); // 获取字符串
for (int i = 0; i < len1 + 1; i++) { // EnBuffer((char *)value0, (unsigned long long)0, (unsigned long)len1,(unsigned char *)"xxxxxxxxxxxxxxxx",2);
value0[i] = 'a' + i;
}
napi_value contents;
napi_create_string_utf8(env, value0, len1, &contents);
return contents;
}