HarmonyOS 鸿蒙Next Native侧和ArkTS相互传递带特殊字符的 buf

发布于 1周前 作者 wuwangju 来自 鸿蒙OS

HarmonyOS 鸿蒙Next Native侧和ArkTS相互传递带特殊字符的 buf

各位大神:

      我目前有一个项目,主题是将自己原始的so库逻辑迁移到鸿蒙平台,so库的主题是【文件及字符串的加解密】,采用对称加密算法,加密算法中存在这样的一个场景:50个字符长度的串,加密之后还是50个字符长度,在C语言中是可以解密过来的,但是有时候加密的结果中可能存在第30个字符为‘\0’或者其他特殊字符的情况,在指定长度的情况下C语言解密也没有问题,这个时候如何将这样的特殊字符串跟ArkTS测相互传递并保证数据的不丢失。

6 回复
在napi里面把char*转成ArrayBuffer就行了,不管有没有特殊字符,都能正常传过来
这种类型要使用arrayBuffer,其实官方不也有对称加密,参考一下官方的库不就行了。OH里面找一下?

参考这个例子:

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>, &amp;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 &lt; 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 &lt; 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>

打印结果:

cke_16331.png

作为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, &amp;argc, args , nullptr, nullptr);

size_t len1 = 0; 
napi_get_value_string_utf8(env, args[0], nullptr, 0, &amp;len1);   // 获取字符串长度到len 
char *value0 = new char[len1 + 1];                                // 分配合适大小的char数组 
napi_get_value_string_utf8(env, args[0], value0, len1 + 1, &amp;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, &amp;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, &amp;argc, args , nullptr, nullptr);

size_t len1 = 0; 
napi_get_value_string_utf8(env, args[0], nullptr, 0, &amp;len1);   // 获取字符串长度到len 
char *value0 = new char[len1 + 1];                                // 分配合适大小的char数组 
napi_get_value_string_utf8(env, args[0], value0, len1 + 1, &amp;len1); // 获取字符串 

for (int i = 0; i &lt; 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, &amp;contents);
return contents;

}

在HarmonyOS鸿蒙系统中,Next Native侧与ArkTS(Ark UI TypeScript)之间传递带有特殊字符的buf(缓冲区数据)时,需确保数据编码和解码的一致性,以及正确处理字符转义问题。

  1. 编码与解码:在Native侧,可以使用UTF-8或其他一致性的编码方式将buf编码为字节流。在ArkTS侧,接收后需使用相应的解码方式还原。确保两端使用的编码方式完全匹配。

  2. 特殊字符处理:对于buf中的特殊字符(如换行符、制表符、引号等),在编码前应进行适当的转义处理,以避免在传输过程中被误解或丢失。在ArkTS侧解码后,再进行相应的反转义处理。

  3. 数据校验:为确保数据完整性,可以在buf的头部添加校验信息(如长度、校验和等),在接收端进行校验,以检测并纠正可能的传输错误。

  4. 异常处理:在传递和接收过程中,应添加异常处理逻辑,以应对可能的编码、解码错误或数据损坏情况。

按照上述方法操作后,通常可以解决大多数关于特殊字符传递的问题。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。

回到顶部