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

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

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

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
相关问题
Web组件接收超长字符串时会被截断
247浏览 • 1回复 待解决
ArkTS如何实现字符串编解码
2804浏览 • 1回复 待解决
检查字符串是否以给定字符串开头
535浏览 • 1回复 待解决
检查字符串是否以给定字符串结尾
421浏览 • 1回复 待解决
如何生成UUID字符串
2206浏览 • 1回复 待解决
字符串如何转为ArrayBuffer?
686浏览 • 1回复 待解决
ResourceStr 类型如何转成字符串
253浏览 • 1回复 待解决
HarmonyOS 如何遍历包含emoji字符串
426浏览 • 1回复 待解决
HarmonyOS字符串替换问题
854浏览 • 1回复 待解决