如何使通过NAPI读取到的ArkTS字符串不被截断?

通过NAPI接口,在C++调用TS层的函数,获取的字符串string总是少一个字符。

HarmonyOS
2024-05-23 22:48:42
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
__catcher

C语言中的字符串实际上是字符数组,它们以null字符('\0')作为结尾标记。

在TypeScript中,字符串的结尾并没有特殊的标记或处理方式。字符串在内存中是不可变的,并且由一系列字符组成,直到字符串内容的末尾。

因此通过NAPI读取ArkTS字符串时,结尾默认多一个结束字符,需要多申请一个字符的内存空间

参考代码:

代码一:

size_t argc = 1; 
napi_value args[1] = {nullptr}; 
size_t str_len; 
napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); 
  
napi_get_value_string_utf8(env, args[0], nullptr, 0, &str_len); 
size_t str_size = str_len + 1; //多准备一个字符长度 
char *buf = new char [str_size]; 
memset(buf, 0, str_size); 
napi_get_value_string_utf8(env, args[0], buf, str_size,  &str_size); 
OH_LOG_INFO(LOG_APP, "%{public}s", buf);

代码二:

size_t argc = 1; 
napi_value args[1] = {nullptr}; 
size_t str_len; 
napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); 
  
size_t stringSize = 0; 
napi_get_value_string_utf8(env, args[0], nullptr, 0, &stringSize); // 获取字符串长度 
std::string valueString; 
valueString.resize(stringSize + 1); 
napi_get_value_string_utf8(env, args[0], &valueString[0], stringSize + 1, &stringSize); // 根据长度传换成字符串 
OH_LOG_INFO(LOG_APP, "%{public}s", valueString.c_str());
分享
微博
QQ
微信
回复
2024-05-24 22:22:40
相关问题
ArkTS如何实现字符串编解码
1192浏览 • 1回复 待解决
如何生成UUID字符串
817浏览 • 1回复 待解决
如何解析JSON字符串
373浏览 • 1回复 待解决
如何实现字符串编解码
941浏览 • 1回复 待解决
如何实现Map转JSON字符串
583浏览 • 1回复 待解决
如何压缩字符串,有人知道吗?
444浏览 • 1回复 待解决
如何实现ArkUI组件字符串变量拼接
1194浏览 • 1回复 待解决
关于字符串分割和重组处理
2560浏览 • 1回复 待解决
如何加载字符串形式H5数据
638浏览 • 1回复 待解决
Web如何使用loadData加载复杂Html字符串
775浏览 • 1回复 待解决
嵌套JSON字符串解析问题
658浏览 • 1回复 待解决
emoji字符串无法进行截取
480浏览 • 1回复 待解决