Как преобразовать 16-ричную строку октетов в формате UTF-8 в кодировку Windows-1251?

Добрый день! 

Я разрабатываю шаблон для устройства и столкнулся с проблемой. В MIB файле OID описан следующим образом: 
<pre><code>workStatus OBJECT-TYPE    
	    	SYNTAX      OCTET STRING (SIZE (0..255))</code></pre> 
При этом item возвращает строку "C4 E5 E6 F3 F0 ED FB E9", и по данным онлайн конвертера hex to string, это слово "Дежурный". 

Я нашел скрипт для Preprocessing: 
<pre><code class="javascript">var str1 = value;
var hex = str1.toString();
if (! hex.match(/\b[0-9A-F ]{6}\b/gi)) {
return str1;
} else {
hex = hex.replace(/ /g,"");
var str = '';
for (var n = 0; n &lt; hex.length; n += 2) { str += String.fromCharCode(parseInt(hex.substr(n, 2), 16)); }
return str; }</code></pre> 

Однако результатом его работы является строка:  Äåæóðíûé. Я понимаю, что Java работает со строками в формате UTF-8. 

Как мне изменить код, чтобы получить строку в правильной кодировке windows-1251? 

Заранее спасибо за помощь!
  • 3 февраля 2025 г. 11:34
Ответы на вопрос 2
Добрый день!

Для корректного преобразования строки в формате 16-ричной кодировки в строку, представленную в кодировке Windows-1251 (которая используется для русского языка и других восточноевропейских языков), вам нужно будет учитывать, что JavaScript не поддерживает кодировки Windows-1251 напрямую. Однако можно использовать массивы байтов для создания нужной строки.

Вот пример, как можно адаптировать ваш код, чтобы получить правильный результат:

```javascript
function hexToWindows1251(hexString) {
    // Удаляем пробелы из строки
    hexString = hexString.replace(/\s+/g, '');

    // Создаем массив байтов
    const byteArray = [];
    for (let i = 0; i < hexString.length; i += 2) {
        byteArray.push(parseInt(hexString.substr(i, 2), 16));
    }

    // Преобразуем байты в строку с использованием Windows-1251
    const decoder = new TextDecoder('windows-1251');
    const uint8Array = new Uint8Array(byteArray);
    return decoder.decode(uint8Array);
}

// Пример использования
var hexString = "C4 E5 E6 F3 F0 ED FB E9"; 
var result = hexToWindows1251(hexString);
console.log(result); // Дежурный
```

### Пояснение:

1. **Удаление пробелов**: Сначала мы убираем все пробелы из ввода, чтобы у нас осталась только строка 16-ричных символов.
2. **Преобразование в массив байтов**: Мы проходим по строке и собираем массив целых чисел, представляющих байты.
3. **Декодирование**: В конце мы используем `TextDecoder`, чтобы преобразовать массив байтов в строку, используя кодировку Windows-1251.

Этот код должен выдать правильный результат, отображая слово "Дежурный" без искажений.
А в Линуксе? 
есть такая утилита - iconv
iconv -f utf8 -t cp1251 filename.txt > filename-win.txt
или
iconv -f utf8 -t cp1251 filename.txt -o filename-win.txt

... если я правильно понял, результат надо отобразить в Zabbix?

В Java тоже нуль, но обратная задача решается так:
https://stackoverflow.com/questions/26995472/java-...
и
https://www.demo2s.com/g/java/how-to-convert-windo...
Похожие вопросы