我需要对String16类型的输入字符串进行编码。为此,我首先将此字符串转换为uint8_t类型的ASCII字节数组,并将此输入缓冲区传递给加密函数,该函数对输入缓冲区进行加密并生成加密的输出缓冲区。类型uint8_t。现在我需要将此输出缓冲区转换回String16并在某个绑定器接口上传输它。
正如预期的那样,加密的输出缓冲区可能包含有效的NUL终止字符(\ 0)。我首先将加密的字节数组转换为std :: string类型,然后最终使用String16 finalString = String16将此字符串转换为String16类型( outputString.c_str());但是当我尝试使用finalString.size()计算最终字符串的大小时,与输出缓冲区的大小相比,我得到的大小为1。
这可能会发生,因为在加密缓冲区中,第二个元素本身将是\ 0,因此字符串终止。
我是否需要使用将ASCII / UTF-8转换为UTF16的功能?这是代码段
#include <iostream>
#include <cstring>
#include <utils/String16.h>
using std::string;
using android::String16;
using android::String8;
Status MyFunc(const ::android::String16& msg, ::android::String16* _aidl_return) override
{
uint8_t input_buffer[msg.size()];
for (int i = 0; i != msg.size(); i++)
{
input_buffer[i] = msg[i];
printf("%x \n", input_buffer[i]);
}
uint32_t ver_length = 8;
uint32_t input_content_length = sizeof(input_buffer);
uint32_t output_buf_length = input_content_length + ver_length;
uint8_t *output_buf = (uint8_t *)calloc(output_buf_length, sizeof(uint8_t));
encrypt_funct(&input_buffer[0], input_content_length, output_buf, &output_buf_length);
std::string temp;
for (int i = 0; i < output_buf_length; i++)
temp.push_back((char)output_buf[i]);
printf("Length of string temp is %d\n", temp.length());//I get correct length
String16 finalString = String16(temp.c_str());
printf("Length of finalString is %d\n", finalString.size());//I get length as 1
return Status::ok();
}