Здравствуйте. Попалась тут очень забавная задачка.
Есть софт и некий аппарат. Софт написан немцами давным давно на VB. Так вот проблема в том что этот софт адекватно видит прибор и может с ним работать только на винде с установленным форматом даты Немецкий (Германия). Если его поменять на русский то прога в упор не видит прибора. Причем в декомпилированных текстах формата даты который бы учавствовал в обмене я не увидел.
Как думаете это баг или фича??
И второе.
Перехватил дамп между прибором и софтом. Достал функцию контроля соединения.
И тут начинаются пляски.
Соединение проходит успешно, по крайней мере событие оригинального кода так говорит.
Дальше формирую запрос:
перехваченный дамп:
55 0E 21 20 80 07 00 00 00 EB AA D3 5B AA
формат тут такой:
[55 0E 21 20] [80 07 00 00 00] [EB AA D3 5B AA]
cзапрос - еще чего то, думал длина но нет - в конце CRC того что посередине.
суть в том что немцы производят невероятное количество лишних манипуляций но суть в том что.
есть строка “8007000000” далее она по 2 символа переводится в число и затем в символ char.
Далее полученная строка преобразуется в массив байт кодом:
stringBuilder.Insert(0, (char)(Convert.ToInt32(text2, 16))); // каждые 2 символа в число и символ
byte[] bytes = Encoding.GetEncoding(1252).GetBytes(strInput);
так вот у меня из строки 80 07 всегда получается 3f 07
Как это вообще возможно то?? в данном случае формат даты не имеет значения.
Че за цыганские шутки???
Тут же надо помнить, что в .NET char это 2 байта, а string это Юникод/UTF-16.
И Encoding.GetBytes пытается преобразовать эти юникодные символы в нужную кодировку.
Так прога на VB при немецком языке выдает 80 07 а при русском языке дает 3f 07
Где то же проблема существует. Допустим если взять кодировку 950 то она возвращает 80 07 правда с ней другие символы неправильно переводит.
В любом случае даже если и не глюк то пусть сам МС это подтвердит.
Да там весь протокол завязан на обработке строк. Гоняют туда сюда. То в байты то из байт в строку потом складывают и опять в байты. Все места изменения этой строки сложно отследить.
Пытаюсь сейчас внедрить свою функцию в код. Но тоже как то не очень …
using Microsoft.VisualBasic;
using System;
using System.Globalization;
using System.Text;
using System.Threading;
public class Program
{
public static void Main()
{
Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");
var sb = new StringBuilder();
sb.Insert(0, Strings.Chr(Convert.ToInt32("80", 16)));
string strInput = sb.ToString();
var bytes = Encoding.GetEncoding(1252).GetBytes(strInput);
}
}
В общем с C# все понятно. Если использовать Strings.Chr то она какое то свое значение возвращает в char.
А у меня было упаковка в char не работало.
Теперь осталось понять как задать нужную культуру для основной проги на VB. Инъекции с культурой не помогают.
Да тут 2.0. Вроде распихал везде где только можно. Также впихнул туда мессаджбокс он выдает что там de-DE локализация. Непонятно совсем.
Подвязываю библиотеку к студии, запускаю отладчик, создаю экземпляр класса из либы и там внутри встроен код локализации. Код показывается немецкий, закидываю туда данные 80070000 и получаю в ответ что что надо в кодировке 1252.
В оригинальной программе также после загрузки показывается немецкий, а в порт сыпется кривые данные. Ну как так то … ((