Имя: Пароль:
1C
1С v8
Разбор BIN файла
0 web_profiler
 
16.01.16
13:13
Есть бинарник
разобрал его на байты
разобрал байты по типам

и получил
http://iscr.ru/1452938802/
вот такую структуру

далее выбираю нужный массив байт и его надо как-то трансформировать к читабельному виду
к примеру штрихкод (если преобразовать массив байт в строку64 и далее Base64Значение) получается таким: 1A 9E DF 02 00 00 00 00

типы значений вот:
http://iscr.ru/1452939073/

Как мне штрихкод в двоичном формате (я так понял DWord) 1A 9E DF 02 00 00 00 00 преобразовать к нормальному виду 48209434 ?
1 web_profiler
 
16.01.16
13:16
ах да забыл, из описания: "Информация сохраняется в двоичный файл, в соответствии с протоколом обмена, без разделителей. Числа записывается младшим байтом вперед. Текстовая информация в кодировке WIN-1251"
2 web_profiler
 
16.01.16
13:16
протокол обмена: http://iscr.ru/1452939073/
3 Garykom
 
гуру
16.01.16
13:17
4 web_profiler
 
16.01.16
13:26
(3) перевел 1A 9E DF 02 00 00 00 00 и получил 309 485 009 821 345 068 724 781 056

мож я чето не то делаю?
5 Garykom
 
гуру
16.01.16
13:27
(4) переверни исходное перед переводом ))
6 web_profiler
 
16.01.16
13:27
у меня возвращаемый тип походу должен быть DWord
7 H A D G E H O G s
 
16.01.16
13:31
Упи&*ил бы того, кто разбирает байт на биты в своих прогах для "оптимизации".
Минимальный квант информации - байт.
8 web_profiler
 
16.01.16
13:33
как перевернуть?
типа 1A 9E DF 02 00 00 00 00
должно  так быть? 00 00 00 00 20 FD E9 F1
9 web_profiler
 
16.01.16
13:34
(7) HELP!!!!!!!!
10 Garykom
 
гуру
16.01.16
13:34
(7) в "больших системах" да, согласен меньше байта нет смысла

но вот если stm32 или arduino, то кучу булевых значений на каждое целый байт тратить?
при ограничениях на память?
11 web_profiler
 
16.01.16
13:35
помогите разобрать, пожалуйста
12 H A D G E H O G s
 
16.01.16
13:35
Как мне штрихкод в двоичном формате (я так понял DWord) 1A 9E DF 02 00 00 00 00


Это не Дворд, это int64/QWORD
13 Garykom
 
гуру
16.01.16
13:37
(11) у меня подозрение что смешались в кучу люди кони... base64 и 2^10
14 web_profiler
 
16.01.16
13:47
(13) кассовый аппарат mini-t400me, выгрузил bin файл,
BinaryData = новый ДвоичныеДанные("D:\111.bin");
Строка64=Base64Строка(BinaryData);
Массив64 = Преобразовать64(Строка64);
    штрих = новый Массив; //просто для проверки из выборки
    штрих.Добавить(26);
    штрих.Добавить(158);
    штрих.Добавить(223);
    штрих.Добавить(2);
    штрих.Добавить(0);
    штрих.Добавить(0);
    штрих.Добавить(0);
    штрих.Добавить(0);
    
    СтрокаШтрих64 = Преобразовать64(, штрих);
    ДвоичШтрих = Base64Значение(СтрокаШтрих64); //1A 9E DF 02 00 00 00 00
15 web_profiler
 
16.01.16
13:49
Функция Преобразовать64(Строка64 = неопределено, Массив64 = неопределено)
    Таб64 = Новый ТаблицаЗначений;
    Таб64.Колонки.Добавить("Код");
    Таб64.Колонки.Добавить("Символ");
    Нпп = 0;
    Для Код = КодСимвола("A") По КодСимвола("Z") Цикл
        стр = Таб64.Добавить();
        стр.Код = Нпп;
        стр.Символ = Символ(Код);
        Нпп = Нпп + 1;
    КонецЦикла;
    Для Код = КодСимвола("a") По КодСимвола("z") Цикл
        стр = Таб64.Добавить();
        стр.Код = Нпп;
        стр.Символ = Символ(Код);
        Нпп = Нпп + 1;
    КонецЦикла;
    стр = Таб64.Добавить();
    стр.Код = Нпп;
    стр.Символ = "0";
    Нпп = Нпп + 1;
    Для Код = 1 По 9 Цикл
        стр = Таб64.Добавить();
        стр.Код = Нпп;
        стр.Символ = Формат(Код,"ЧЦ=1; ЧДЦ=0");
        Нпп = Нпп + 1;
    КонецЦикла;
    стр = Таб64.Добавить();
    стр.Код = Нпп;
    стр.Символ = "+";
    Нпп = Нпп + 1;
    стр = Таб64.Добавить();
    стр.Код = Нпп;
    стр.Символ = "/";
    
    Если Массив64 = неопределено Тогда
        Если Строка64 = неопределено Тогда
            Сообщить("неверный вызов функции");
            Возврат неопределено;
        КонецЕсли;
        //Уберем переносы строк
        Строка64 = СтрЗаменить(Строка64, Символ(10), "");
        Строка64 = СтрЗаменить(Строка64, Символ(13), "");
        
        //преобразовываем строку в массив
        Если СтрДлина(Строка64) % 4 <> 0 Тогда
            Сообщить("длина строки на входе должна быть кратна 4");
            Сообщить(СтрДлина(Строка64));
            Возврат неопределено;
        КонецЕсли;
        Кол4 = Цел(СтрДлина(Строка64) / 4);
        РазмерМ = Кол4 * 3;
        Если Прав(Строка64, 2) = "==" Тогда
            РазмерМ = РазмерМ - 2;
        ИначеЕсли Прав(Строка64, 1) = "=" Тогда
            РазмерМ = РазмерМ - 1;
        КонецЕсли;  
        Массив64 = Новый Массив(РазмерМ);
        Для А = 1 По Кол4 Цикл
            Число3 = 0;
            Для Б = 1 По 4 Цикл
                Буква1 = Сред(Строка64, (А-1)*4 + Б, 1);
                Если Буква1 = "=" Тогда
                    Код4 = 0;
                Иначе
                    стрН = Таб64.Найти(Буква1, "Символ");
                    Если стрН = Неопределено Тогда
                        Сообщить("ошибка при поиске "+ КодСимвола(Буква1));
                    Иначе
                        Код4 = стрН.Код;
                    КонецЕсли;
                КонецЕсли;
                Число3 = Число3 * 64 + Код4;
            КонецЦикла;
            Ост = Число3 % 256;
            Индекс = (А-1)*3 + 2;
            Если Индекс <= РазмерМ - 1 Тогда
                Массив64[Индекс] = Ост;
            КонецЕсли;
            Число3 = (Число3 - Ост) / 256;
            Ост = Число3 % 256;
            Индекс = (А-1)*3 + 1;
            Если Индекс <= РазмерМ - 1 Тогда
                Массив64[Индекс] = Ост;
            КонецЕсли;
            Число3 = (Число3 - Ост) / 256;
            Ост = Число3 % 256;
            Массив64[(А-1)*3 + 0] = Ост;
        КонецЦикла;
        Возврат Массив64;
    Иначе //Преобразовываем массив в строку
        Строка64 = "";
        Кол3 = Цел(Массив64.Количество() / 3);
        Если Массив64.Количество() % 3 <> 0 Тогда
            Кол3 = Кол3 + 1;
        КонецЕсли;
        Для А = 1 По Кол3 Цикл
            Число3 = Массив64[(А-1)*3];
            Если (А-1)*3+1 <= Массив64.ВГраница() Тогда
                Код3 = Массив64[(А-1)*3+1];
            Иначе
                Код3 = 0;
            КонецЕсли;
            Число3 = Число3*256 + Код3;
            Если (А-1)*3+2 <= Массив64.ВГраница() Тогда
                Код3 = Массив64[(А-1)*3+2];
            Иначе
                Код3 = 0;
            КонецЕсли;
            Число3 = Число3*256 + Код3;
            
            Ост4 = Число3 % 64;
            Число3 = (Число3 - Ост4) / 64;
            Ост3 = Число3 % 64;
            Число3 = (Число3 - Ост3) / 64;
            Ост2 = Число3 % 64;
            Число3 = (Число3 - Ост2) / 64;
            Ост1 = Число3 % 64;
            Число3 = (Число3 - Ост1) / 64;
            стрН = Таб64.Найти(Ост1, "Код");
            Если стрН = неопределено Тогда
                Сообщить("Ошибка при поиске");
            Иначе
                Строка64 = Строка64 + стрН.Символ;
            КонецЕсли;
            стрН = Таб64.Найти(Ост2, "Код");
            Если стрН = неопределено Тогда
                Сообщить("Ошибка при поиске");
            Иначе
                Строка64 = Строка64 + стрН.Символ;
            КонецЕсли;
            стрН = Таб64.Найти(Ост3, "Код");
            Если стрН = неопределено Тогда
                Сообщить("Ошибка при поиске");
            Иначе
                Строка64 = Строка64 + стрН.Символ;
            КонецЕсли;
            стрН = Таб64.Найти(Ост4, "Код");
            Если стрН = неопределено Тогда
                Сообщить("Ошибка при поиске");
            Иначе
                Строка64 = Строка64 + стрН.Символ;
            КонецЕсли;
        КонецЦикла;
        //Если количество символов не делится на 3, то на конце должны быть
        //знаки "="
        Если Массив64.Количество() % 3 = 1 Тогда
            Строка64 = Лев(Строка64, СтрДлина(Строка64)-2)+ "==";
        ИначеЕсли Массив64.Количество() % 3 = 2 Тогда
            Строка64 = Лев(Строка64, СтрДлина(Строка64)-1)+ "=";
        КонецЕсли;
        Возврат Строка64;
    КонецЕсли;
КонецФункции
16 web_profiler
 
16.01.16
14:36
у меня так и не получилось преобразовать 1A 9E DF 02 00 00 00 00 в 48209434
ткните носом, что я не так делаю?
17 Кирпич
 
16.01.16
14:44
(16) 02DF9E1A это 48209434. найди где нибудь функцию перевода из 16 в десятичную
18 DES
 
16.01.16
14:44
кстати, ктонить знает как в бинарном файле заменить 1 байт на языке 1с ?
19 web_profiler
 
16.01.16
14:46
через конвертер понял, что мне надо как-то получть тип UINT32 (DCBA)
http://iscr.ru/1452944794/
20 web_profiler
 
16.01.16
14:48
(17) уже нашел - не работает
Функция Из_Любой_В_10(Знач Значение="0",Нотация=36) Экспорт
     Если Нотация<=0 Тогда Возврат(0) КонецЕсли;
     Значение=СокрЛП(Значение);
     Если Значение="0" Тогда Возврат(0) КонецЕсли;
     Результат=0;
     Длина=СтрДлина(Значение);
     Для Х=1 По Длина Цикл
          М=1;
          Для У=1 По Длина-Х Цикл М=М*Нотация КонецЦикла;
          Результат=Результат+(Найти("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",Сред(Значение,Х,1))-1)*М;
     КонецЦикла;
     Возврат Окр(Результат);
КонецФункции
21 Кирпич
 
16.01.16
14:48
(20) работает

Функция Из_Любой_В_10(Знач Значение="0",Нотация=36) Экспорт
     Если Нотация<=0 Тогда Возврат(0) КонецЕсли;
     Значение=СокрЛП(Значение);
     Если Значение="0" Тогда Возврат(0) КонецЕсли;
     Результат=0;
     Длина=СтрДлина(Значение);
     Для Х=1 По Длина Цикл
          М=1;
          Для У=1 По Длина-Х Цикл М=М*Нотация КонецЦикла;
          Результат=Результат+(Найти("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",Сред(Значение,Х,1))-1)*М;
     КонецЦикла;
     Возврат Окр(Результат);
КонецФункции

&НаКлиенте
Процедура Команда1(Команда)                                //"00000002DF9E1A"
    // Вставить содержимое обработчика.
    Сообщить(Из_Любой_В_10("2DF9E1A",16));
КонецПроцедуры
22 web_profiler
 
16.01.16
14:50
кстати, еше INT32 правильное значение
http://iscr.ru/1452945020/
23 web_profiler
 
16.01.16
14:51
Сообщить(Из_Любой_В_10("2DF9E1A",16));

походу понял "16" а не как я 36
24 Кирпич
 
16.01.16
14:51
(22) да хоть INT128
25 web_profiler
 
16.01.16
14:52
елки палки
502 450 310 926 442 618 854 309 632
это я получаю
26 Кирпич
 
16.01.16
14:52
(25) кончай тупить
27 web_profiler
 
16.01.16
14:53
:( в 4 прилег :(
28 Кирпич
 
16.01.16
14:53
Сообщить(Из_Любой_В_10("2DF9E1A",16)); будет только 48 209 434
29 Кирпич
 
16.01.16
14:54
ты наверное байты не меняешь местами
30 web_profiler
 
16.01.16
14:54
31 web_profiler
 
16.01.16
14:55
я двданные вместо строки в функию подставляю
32 Кирпич
 
16.01.16
14:57
(31) ты в школе на информатику вообще ходил? какие двоичные данные если строка нужна?
33 web_profiler
 
16.01.16
14:57
да понял уже, не выспанный
34 Garykom
 
гуру
16.01.16
14:57
(18) через издевательства с двоичные данные и base64 ?
http://catalog.mista.ru/public/252365/
35 Garykom
 
гуру
16.01.16
15:00
(34)+ для 7.7 нужна ВК http://catalog.mista.ru/public/127873/

ЗЫ когда то делал через это драйвер низкоуровневый для DBF файлов...
потому что один особо умный разраб в char поля используемые как индекс таблицы на засовывал "непечатных символов" (коды ASCII до 32) которые ничем оттуда не выковыривались правильно
36 web_profiler
 
16.01.16
15:00
(32) спасибо за "расчихление" меня
37 Музон Хиггса
 
16.01.16
16:39
(7) Байту байтово, а биту битово.
38 vde69
 
16.01.16
17:19
(7) ты никогда не встречал железо работающее на 6 разрядной двоичной системе? где 1 байт состоит из 6 бит ???

среди перефирийки до сих пор экзотики полно... я встречал например 12х разрядный умножитель :) и параллельный порт с 4 пинами передачи данных...
39 Кирпич
 
16.01.16
18:50
1с могли бы уже добавить работу с двоичными данными нормальную. Вроде не бухгалтера на 1с пишут давно.
40 Кирпич
 
16.01.16
18:55
наверное боятся, что вирусы начнут на 1с писать
41 web_profiler
 
16.01.16
19:11
продолжим?
42 web_profiler
 
16.01.16
19:11
есть ДвДанные 21 - теперь эту штуку мне в биты надо разложить
43 web_profiler
 
16.01.16
19:12
т.е. чтоб получить 10000100
44 web_profiler
 
16.01.16
19:14
тем, кому интересно наф... мне биты - смотрим сюда
http://iscr.ru/1452939073/

пункт <ADD>
45 web_profiler
 
16.01.16
19:14
п.с. ДвДанные этого байта я получил
46 Гобсек
 
17.01.16
14:45
(39)+1
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший