Member 12624812 Ответов: 2

Преобразование строковых значений в cstring означает, что результат cstring не получает полной длины строки?


При декодировании штрих-кода результат значения штрих-кода сохраняется в

std::string str_data результат значения штрих-кода должен быть таким

str_data=[)> {RS}0603{GS}(51)KD-78F0443GBGAHAX/01032/T6(53)1256(54)15204D1
1E4-00210A002(55)2015/05/15 (56)частичный (57) T. (58)2 (59)1 (5D)02(5F)
1519 1519XP001 (5H)ЯПОНИЯ (5J)ЯПОНИЯ (5L)ЯПОНИЯ (5M)6255-3544(67) 0 (68)U
PD78F0443GB-ГАХ-ТОПОР(69)002G1S5X@(6Б)0001102866(6И)ЛГ-151(6К) - ПИ(6Л
)JP (6M)JP{RS}{EOT}

но значение результата создает нулевое пространство в результирующем значении, например
[)>000603?(51)KD-78F0443GBGAHAX/01032/T6(53)1256(54)15204D1
1E4-00210A002(55)2015/05/15 (56)частичный (57) T. (58)2 (59)1 (5D)02(5F)
1519 1519XP001 (5H)ЯПОНИЯ (5J)ЯПОНИЯ (5L)ЯПОНИЯ (5M)6255-3544(67) 0 (68)U
PD78F0443GB-ГАХ-ТОПОР(69)002G1S5X@(6Б)0001102866(6И)ЛГ-151(6К) - ПИ(6Л
)ПИ(6М)ЯПО

нулевые значения выделены жирным шрифтом.

и еще одна проблема заключается в том, что при преобразовании этого значения std:: string в CString я получаю "[)>" этот результат только из-за получения нулевого значения он пропускает остальные значения.

Итак, мне нужен правильный способ сохранить это результирующее значение..

Что я уже пробовал:

Я попытался стереть нулевое пространство, используя следующий код
while(1)
     {
      int letter=a_strdata.find('\0');
      if(letter==-1)
      {
       break;
      }
      a_strdata= a_strdata.erase(letter,1);
     }


Он удаляет нулевое пространство и дает полную длину строки результата, но мне нужен результат с нулевым пространством или правильным преобразованием.

CPallini

Как вы "конвертируете" std:. string в CString? Вы используете сборку UNICODE?

Member 12624812

Нет мультикодовых
использование этого преобразования
СТД::строка str_data.c_str();
преобразование в CString

2 Ответов

Рейтинг:
2

Jochen Arndt

Первая проблема, по-видимому, заключается в том, как печатаются строки вашего примера.

Существуют части с аббревиатурами контрольных кодов, заключенными в круглые скобки (см. Управляющий персонаж-Википедия[^Таким образом, возможно, что это заполнители, созданные функцией печати.

{RS} например, может быть держатель места для управляющего кода 0x1E (RS = разделитель записей).

Таким образом, вы должны сначала проверить, если ваш std::string действительно содержит {RS} или байт 0x1E. Чтобы проверить это, выведите шестнадцатеричный код для первых букв.

Я предполагаю, что я прав, потому что это объяснило бы, почему CString печатается по-другому.

Следующей проверкой будет распечатка шестнадцатеричных значений из CString. Они могут быть такими же, как и для std::string Тогда была только проблема с выводом, но не с назначением.

Как уже упоминалось CPallini в комментариях, вы также можете получить проблемы со сборками Unicode. Чтобы избежать этого, вы должны использовать CStringA вместо CString если строки содержат только символы ASCII (коды меньше 0x80):

CStringA str = a_strdata.c_str();


Если CStringA это все еще не то же самое, что std::string проверьте, есть ли во входной строке нулевые байты. Если это так, то вы не можете использовать CString Затем вы должны использовать двоичный буфер.

Простая проверка:
CStringA str = a_strdata.c_str();
for (int i = 0; i < str.GetLength(); i++)
    printf("%02X %02X\n", a_strdata.at(i), str.GetAt(i));


Рейтинг:
2

KarstenK

Простое решение состоит в том, чтобы перебрать ваши str_data и добавить каждый символ в CString.

CString c_string;

for (int index = 0; index < str_data.length(); index++){
    c_string += str_data[index];
}

Но я думаю, что правильное решение заключается в том, что std::string-это символы, а ваша CString-многобайтовая.
Таким образом, лучшим решением должен быть конструктор преобразования:
CString s = CString(str_data);//conversion constructor