Удаление невидимых символов из UTF-8 buffer в JS преобразова

Работа с панелями оператора Weintek - подключение, программирование, совмещение с ПЛК

Модераторы: kiv, 8bit, VanMo

Удаление невидимых символов из UTF-8 buffer в JS преобразова

Сообщение AndreiKM » 30 ноя 2024, 16:34

Всем привет.
Может кто подскажет как решить следующую проблему ?
В регистрах RW0-RW8 хранится ASCII коды (до 16 символов) кодировка UTF-8
В коде JS они считываются в буфер из 16-ти байт и присваивается строковой переменной.
Проблема заключается в том, что когда строка короче 16 символов, в буфер попадают из регистров RW не пробелы, а какие-то невидимые спецсимволы, которые невозможно удалить никакими функциями JS (.trim(), .replace()) и эти символы передаются в string "chatID'. Это видно по длине строки (которая всегда равна 16.

При ее использовании далее в коде - естественно не инициализируется телеграм бот.
Также обрывается вывод в консоль при попытке вывода в нее нескольких таких переменных.
Проблема решается только вбиванием пробелов во все незаполненные текстом регистры RW и последующим их удалением .trim().
Но это выглядит как-то "криво" и не очевидно для пользователя при вводе RW0-RW8
Может есть какой-то совет - как убрать эти невидимые спецсимволы из буфера?

Код: Выделить всё
var chatId = '';

// Read an UTF-8 string
var utf8decoder = new TextDecoder();

driver.getData(this.config.TelegramChatID, 8, (err, data) => {
    if (err) {
        console.log('Error:', err.message);
    } else {
        console.log("timestamp:", data.timestamp);
        console.log("buffer.byteLength:", data.buffer.byteLength);
        var bufferAsUint8Array = new Uint8Array(data.buffer);
        chatId = utf8decoder.decode(bufferAsUint8Array);  // присваивает 16 байт всегда
        chatId = chatId.trim();      // не работает если не пробелы в  строке !!!
        console.log("chatId:", chatId);
        console.log("ChatId lenght:", chatId.length);
    }
]);
AndreiKM
 
Сообщения: 9
Зарегистрирован: 14 дек 2023, 23:38

Re: Удаление невидимых символов из UTF-8 buffer в JS преобра

Сообщение AndreiKM » 02 дек 2024, 18:17

Пришел ответ с техподдержки Weintek - может кому пригодится...
Для того чтобы удалить нули из буфера считанного из регистров ASCII и получить " чистую" строку - предложили следующий JS код, с определением конца строки через метод .indexOf(0).
Проверил - работает

Код: Выделить всё
driver.getData(this.config.TelegramChatID, 8, (err, data) => {
    if (err) {
        console.log('Error:', err.message);
    } else {
        console.log("timestamp:", data.timestamp);
        console.log("buffer.byteLength:", data.buffer.byteLength);
        var bufferAsUint8Array = new Uint8Array(data.buffer);
       
        let strlen = bufferAsUint8Array.indexOf(0);
   if (strlen >= 0) {
            chatId = utf8decoder.decode(new Uint8Array(data.buffer, 0, strlen));
   } else {
       chatId = utf8decoder.decode(data.buffer);
   }
        console.log("chatId:", chatId);
        console.log("ChatId lenght:", chatId.length);
    }
});
AndreiKM
 
Сообщения: 9
Зарегистрирован: 14 дек 2023, 23:38


Вернуться в Weintek

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 48