如何使通过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);
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

代码二:

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());
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
分享
微博
QQ
微信
回复
2024-05-24 22:22:40
相关问题
HarmonyOS 字符串太长被截断
736浏览 • 1回复 待解决
Web组件接收超长字符串时会被截断
912浏览 • 1回复 待解决
ArkTS如何实现字符串编解码
3934浏览 • 1回复 待解决
HarmonyOS 读取本地json文件转成字符串
918浏览 • 1回复 待解决
HarmonyOS 在ArkTS中map如何转成字符串
990浏览 • 1回复 待解决
HarmonyOS ArkTS里面字符串怎么换行
1101浏览 • 1回复 待解决
检查字符串是否以给定字符串开头
1493浏览 • 1回复 待解决
关于鸿蒙arkts解析json字符串问题
2275浏览 • 3回复 待解决
检查字符串是否以给定字符串结尾
1273浏览 • 1回复 待解决
如何生成UUID字符串
2968浏览 • 1回复 待解决
字符串反射
734浏览 • 1回复 待解决