Почему мой 8-битный указатель не обновляется правильно? - PullRequest
0 голосов
/ 06 апреля 2019

Направления здесь:

Я должен преобразовать строку ASCII в точно такой же входной буфер, который в данном случае pt1.К сожалению для меня, цикл выполняется только один раз, и, следовательно, мой выходной буфер содержит только первое короткое значение.

Я пытаюсь преобразовать строку ASCII в 16-разрядную строку Unicode.Согласно указаниям, 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;
}

1 Ответ

2 голосов
/ 06 апреля 2019

Существует несколько проблем:

  • Ваша функция преобразования не производит ничего видимого для вызывающей стороны: вы сохраняете значения кодовых точек в локальном массиве и возвращаете вызывающей стороне.Компилятор предупреждает вас, что по крайней мере pt3 установлено и не используется, но более продвинутый компилятор оптимизирует весь код для этой функции без побочных эффектов.
  • Какое описание API для Convert?Похоже, вы получаете указатель на строку ASCII, замаскированный под указатель на unsigned short, и кажется, что преобразование должно быть выполнено на месте.Если это фактическое требование, это очень плохая идея.Функция должна получить указатель на массив назначения с типом unsigned short *, size_t, указывающий количество элементов этого массива, и указатель на исходную строку с типом const char *.
  • Как следуетбайты вне диапазона ASCII будут обработаны?Кодируется ли исходная строка в заданную кодовую страницу?это кодировка UTF-8?Должна ли функция сообщать об ошибке?

Из 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...