为什么我的8位指针不能正确更新?

问题描述 投票:0回答:1

方向在这里:

我应该在完全相同的输入缓冲区中转换ASCII字符串,在这种情况下是pt1。不幸的是,循环只执行一次,因此我的输出缓冲区只包含第一个短值。

我正在尝试将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;
}
c
1个回答
2
投票

有很多问题:

  • 转换函数不会为调用者生成任何可见内容:将代码点值存储到本地数组并返回调用者。编译器警告您至少pt3已设置且未使用,但更高级的编译器将优化此函数的所有代码而没有副作用。
  • Convert的API描述是什么?您似乎收到一个指向ASCII字符串的指针,该字符串伪装成指向unsigned short的指针,似乎应该在适当的位置执行转换。如果这是实际要求,那是一个非常糟糕的主意。该函数应该接收一个指向目标数组的指针,类型为unsigned short *size_t指定此数组的元素数和指向源字符串的指针,类型为const char *
  • 如何处理ASCII范围之外的字节?源字符串是否在给定代码页中编码?它是UTF-8编码的?该功能是否应报告错误?

从编辑,您似乎确认了疯狂的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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.