方向在这里:
我应该在完全相同的输入缓冲区(在本例中为pt1
)中转换ASCII字符串。
对我来说不幸的是,循环仅执行一次,因此我的输出缓冲区仅包含第一个short值。
我正在尝试将ASCII字符串转换为Unicode 16位字符串。根据指示,pt1
应该指向ASCII字符串。
预期输出在此链接上。
https://i.stack.imgur.com/COpXl.jpg
void Convert(unsigned short *pt1) {
// pt1 is a pointer to a null-terminated variable length ASCII string
// 0x30 0x31 0x32 0x00 (sentinel value)
unsigned char *pt2 = (unsigned char *)pt1;
unsigned char value = *pt2;
while (*pt2 != 0x00) {
value = *pt2;
*pt1 = (unsigned short)value;
pt2++;
pt1++;
}
*pt1 = 0x0000;
}
答案 0 :(得分:2)
存在多个问题:
pt3
且不使用,但更高级的编译器将为此功能优化所有代码,而没有副作用。Convert
的API描述是什么?您似乎收到了一个伪装为unsigned short
指针的ASCII字符串指针,并且似乎应该在适当的位置执行转换。如果这是实际要求,那是一个非常糟糕的主意。该函数应该收到指向类型为unsigned short *
的目标数组的指针,指定该数组元素数的size_t
和类型为const char *
的源字符串的指针。在EDIT中,您似乎确认了疯狂的API要求。假设参数数组中有足够的空间,则应执行从最后一个字节到第一个字节的转换,从而避免踩到自己的脚趾:
void Convert(unsigned short *pt1) {
// pt1 is a pointer to a null-terminated variable length ASCII string
// with enough space to receive the converted value including a null terminator
unsigned char *pt2 = (unsigned char *)pt1;
size_t i;
// Compute the number of bytes
for (i = 0; pt2[i] != '\0'; i++)
continue;
// Convert the contents from right to left
// Assuming ISO8859-1 encoding for bytes outside the ASCII range
for (;;) {
pt1[i] = (unsigned short)pt2[i];
if (i-- == 0)
break;
}
}