Имя: Пароль:
1C
 
Получить двоичные данные из строки
, ,
0 1c_yeah
 
14.06.19
12:37
В платформе 8.3.10
есть метод ПолучитьДвоичныеДанныеИзСтроки(Строка, Кодировка)

Суть его в том что он строковое значение конвертирует в двоичные данные.

Мне надо на платформе 8.3.8 делать тоже самое, но этого метода там нет.

Подскажите процедуру которой можно заменить такой метод глобального контекста. Спасибо


Пробовал таким образом.

Запрос = Новый HTTPЗапрос;
Запрос.УстановитьТелоИзСтроки(Строка, Кодировка);
Двд =  Запрос.ПолучитьТелоКакДвоичныеДанные();

И таким

ПотокПамять = Новый ПотокВПамяти;
Писатель = Новый ЗаписьДанных(ПотокПамять, Кодировка);
Писатель.ЗаписатьСтроку(Строка, Кодировка);
Писатель.Закрыть();
Двд = ПотокПамять.ЗакрытьИПолучитьДвоичныеДанные();

Но сервис где используются эти двоичные данные почему то не принимает их ни по одному способу кроме типового метода ПолучитьДвоичныеДанныеИзСтроки
1 Вафель
 
14.06.19
12:40
ну ты строки пишешь как строки, а не как HEX последовательности
2 Вафель
 
14.06.19
12:41
только записать в файл и прочитать
3 1c_yeah
 
14.06.19
12:43
Можно поподробней
4 Юрий Лазаренко
 
14.06.19
13:01
Поток = Новый ПотокВПамяти;
ЗаписьТекста = Новый ЗаписьТекста(Поток) ;
ЗаписьТекста.Записать(<ИсходнаяСтрока>);
ЗаписьТекста.Закрыть();
ДвоичныеДанные = Поток.ЗакрытьИПолучитьДвоичныеДанные();
Строка64 = Base64Строка(ДвоичныеДанные);
5 1c_yeah
 
14.06.19
13:07
(4) На выходе надо получить ДвочиныеДанные
6 lodger
 
14.06.19
13:09
(5) убери последнюю строчку.
7 1c_yeah
 
14.06.19
13:12
(6) (4)

Отработало но сервис не проглотил. Значит все же есть отличия от результата ПолучитьДвоичныеДанныеИзСтроки(Строка, Кодировка).

Ту же строку преобразовываю методом ПолучитьДвоичныеДанныеИзСтроки(Строка, Кодировка) - все ок
По другому не принимает сервис
8 Юрий Лазаренко
 
14.06.19
13:18
(7) Кодировка?
9 Юрий Лазаренко
 
14.06.19
13:19
В строке ЗаписьТекста = Новый ЗаписьТекста(Поток) ; поиграйся с параметрами Кодировка, ЗаписатьВОМ. И с остальными тоже, иногда РазделительСтрок тоже козлит.
10 1c_yeah
 
14.06.19
13:20
(8) Кодировка UTF-8 используется во всех моих способах и в типовом ПолучитьДвоичныеДанныеИзСтроки(Строка, Кодировка)
11 Garykom
 
гуру
14.06.19
13:26
(7) >Отработало но сервис не проглотил.

Имхо проблема в чем то ином.
Что за сервис и что он хочет?
12 1c_yeah
 
14.06.19
14:59
Вот видно что в моих способах двоичные данные одинаковые
а в методе
ПолучитьДвоичныеДанныеИзСтроки(Строка, Кодировка) другие

http://prntscr.com/o1t6dq
13 Garykom
 
гуру
14.06.19
15:19
(12) Разницу что ли не видишь?

У тебя
7B 0D 0D 0A
7B 0D 0A

Просто одна 0D пропущена и все.
14 Garykom
 
гуру
14.06.19
15:22
Ага везде двойное "0D0D" заменено на одинарное "0D" прикольно
15 1c_yeah
 
14.06.19
15:22
(13) Это как раз я вижу. Вопрос почему результат преобразования одной и той же строки отличается?
16 Garykom
 
гуру
14.06.19
15:24
(15) Дай свою исходную строку которая 0D выдает
17 1c_yeah
 
14.06.19
15:24
{
"Filter": {
"StartDate": "13.06.2019",
"EndDate": "14.06.2019",
"IgnoreDeleted": true,
"IsPrimary": true,
"DocDirectionType": 0,
"IsPrivsInclude": true
}
}
18 Garykom
 
гуру
14.06.19
15:26
Так я и думал ))

0D = CARRIAGE RETURN (CR) (U+000D)

Ты разницу между \r\n и просто \n понимаешь? Между linux и windows ?
19 Garykom
 
гуру
14.06.19
15:26
Короче легкая даже не бага а недочета в платформе 1С, связанная с разной архитектурой операционных система и Enter'ов (переносов строки и возвратов каретки)
20 Юрий Лазаренко
 
14.06.19
15:30
Ну так читай (9), конкретно " иногда РазделительСтрок тоже козлит". Попробуй в качестве разделитея строк указать пустую строку ""
21 1c_yeah
 
14.06.19
15:30
Так че делать?
22 1c_yeah
 
14.06.19
15:30
(20) Щас попробую
23 1c_yeah
 
14.06.19
15:32
(20) Не помогло
24 Garykom
 
гуру
14.06.19
15:34
(23) Убери все Символы.ВК и Символы.ПС
25 1c_yeah
 
14.06.19
15:39
Если убераю. то да, двоичные данные все одинаковые , все зависимости от методов.

Но в таком случае вообще не воспринимается сервисом.
26 arsik
 
гуру
14.06.19
15:39
"<РазделительСтрокВФайле> (необязательный)
Тип: Строка.
Определяет разделение строк в файле для конвертации в стандартный перевод строк ПС.
Значение по умолчанию: ВК+ПС"
27 Вафель
 
14.06.19
15:40
не ужто сервер не читает жсон с разделителями строк?
28 arsik
 
гуру
14.06.19
15:42
Вот так попробуй.
ЗаписьТекста = Новый ЗаписьТекста(Поток,"UTF-8",Символы.ВК,,Символы.ВК)
29 1c_yeah
 
14.06.19
15:43
(28) Сейчас
30 Garykom
 
гуру
14.06.19
15:45
(25) Эээ как бы попроще то сказать, но обычно двоичные данные в сервис по http их как бы в Base64 обычно
31 Garykom
 
гуру
14.06.19
15:46
А если json то его не надо в двоичные, он как строка прекрасно лезет
32 Garykom
 
гуру
14.06.19
15:46
Но я хз что там у вас за "сервис"
33 Юрий Лазаренко
 
14.06.19
15:47
(30) А попробуй угадай, как там этот сервис их разбирает
34 1c_yeah
 
14.06.19
15:48
(28) Не помогло
35 Юрий Лазаренко
 
14.06.19
15:48
(31) JSON кодировать часто просят, когда в нем кириллица и всякие спецсимволы.
36 1c_yeah
 
14.06.19
15:50
(32) Да, там сначала в json потом в двоичныеданные потом в строку base64 потом еще КодироватьСтроку и только тогда отпарвлять.

Такое требование апи.
37 Garykom
 
гуру
14.06.19
15:50
(35) Типа сервер любит обрезать до 7 бит аля UTF-7? Такие еще встречаются?
38 1c_yeah
 
14.06.19
15:51
КодироватьСтроку(Base64Строка(ПолучитьДвоичныеДанныеИзСтроки(JSON_DATA)),СпособКодированияСтроки.КодировкаURL, "UTF-8");

Вот рабочий код под 8.3.10
Надо такой же только под 8.3.8
39 1c_yeah
 
14.06.19
15:52
Загвостка только в ПолучитьДвоичныеДанныеИзСтроки
40 Garykom
 
гуру
14.06.19
15:53
(36) Тебе надо (28) но с параметрами немного другими
41 Юрий Лазаренко
 
14.06.19
15:54
(39) Так ты ж писал в (25) что ДД одинаковые. Если одинаковые, то делай для них

Строка64 = Base64Строка(ДвоичныеДанные);

как написано в (4), а для того, что получится -

КодироватьВСтроку()
42 Garykom
 
гуру
14.06.19
15:54
Друг подсказал, надо обязательно ЗаписьТекста.ЗаписатьСтроку()
43 1c_yeah
 
14.06.19
15:56
(42) Щас попробую
44 1c_yeah
 
14.06.19
15:58
(42) Не помогло
45 Garykom
 
гуру
14.06.19
16:00
(44)
ЗаписьТекста (TextWriter)
ЗаписатьСтроку (WriteLine)
Синтаксис:
ЗаписатьСтроку(<Строка>, <Разделитель>)
Параметры:
<Строка> (обязательный)
Тип: Строка.
Записываемая строка. После записи строки в файл помещается разделитель строк.
<Разделитель> (необязательный)
Тип: Строка.
Разделитель строк. Если не указан, то совпадает с указанным при открытии файла.
Значение по умолчанию: ПС.
Описание:
Записывает строку текста в файл. В конце строки записывается разделитель.
Доступность:
Тонкий клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).
Пример:
Текст.ЗаписатьСтроку("Добро пожаловать!");
46 Вафель
 
14.06.19
16:01
(35) ну так кирилица обычно через юникод последовательности передается
47 Garykom
 
гуру
14.06.19
16:02
(44) У тебя двойной разделитель в строках ВК+ВК
48 Garykom
 
гуру
14.06.19
16:03
(47)+ Выясни у сервиса какой нужен разделитель.
И да очень странно что не принимает JSON совсем без разделителей строк ибо они лишние.
49 1c_yeah
 
14.06.19
16:05
(48) А как сделать что бы разделитель был один.
50 Юрий Лазаренко
 
14.06.19
16:06
Посмотри, какую строку ты в итоге отправляешь серверу. По идее это доллжно быть что-то вроде "AeafewrfgBHflef5BfwefRGwfdvcFNx", так как Base64Строка(). Если там "DD FF KK JJ 33 ff 77 55", то это неверно.
51 Юрий Лазаренко
 
14.06.19
16:06
(49) СтрЗаменить?
52 1c_yeah
 
14.06.19
16:10
(50) Так и есть, как положено
53 1c_yeah
 
14.06.19
16:11
(51) Этот лишний разделитель в двоичных данных появляется при ЗаписиТекста в поток
54 ptiz
 
14.06.19
16:17
Так будет работать:
    ИмяВремФайла = ПолучитьИмяВременногоФайла();
    ЗаписьТекста = Новый ЗаписьТекста(ИмяВремФайла, "CESU-8", , , "");
    ЗаписьТекста.Записать(Строка);
    ЗаписьТекста.Закрыть();
    Двд5 = Новый ДвоичныеДанные(ИмяВремФайла);
55 Garykom
 
гуру
14.06.19
16:18
(53) Или так


Поток = Новый ПотокВПамяти();
ЗаписьТекста = Новый ЗаписьТекста(Поток, КодировкаТекста.UTF8);
ЗаписьТекста.ЗаписатьСтроку(ТвояСтрокаJSON);
ЗаписьТекста.Закрыть();
ДвоичныеДанные = Поток.ЗакрытьИПолучитьДвоичныеДанные();
Строка64 = Base64Строка(ДвоичныеДанные );
56 ptiz
 
14.06.19
16:23
(55) В том и дело, что такой пример не работает. Добавляет лишний 0D.
57 1c_yeah
 
14.06.19
16:23
(54) Работает!!
58 ptiz
 
14.06.19
16:24
(57) Почему-то пятый параметр в "Новый ЗаписьТекста" не работает с потоком, поэтому - только через файл получилось.
59 1c_yeah
 
14.06.19
16:24
(54) Только вопрос а если мне кодировка нужна будет другая а не "CESU-8"
60 1c_yeah
 
14.06.19
16:27
(58) ДА!

Еще вот так работает

    ПотокПамять = Новый ПотокВПамяти;
    Писатель = Новый ЗаписьДанных(ПотокПамять, Кодировка,,"","");
    Писатель.ЗаписатьСтроку(Строка, Кодировка);
    Писатель.Закрыть();
    Двд2 = ПотокПамять.ЗакрытьИПолучитьДвоичныеДанные();
61 ptiz
 
14.06.19
16:29
(59) Это я по-привычке, это тот же UTF-8, но без BOM. На 8.2 только так выкручиваюсь.
62 Юрий Лазаренко
 
14.06.19
16:33
(61) Для без ВОМ есть же параметр <ЗаписатьBOM>
63 Garykom
 
гуру
14.06.19
16:34
Изначально проблема в том что в исходной json строке кривые "разделители строк"
64 ptiz
 
14.06.19
16:37
(62) Да, для потока, и в 8.3 :)
65 1c_yeah
 
14.06.19
16:39
(63) Сам текст json формируется так

    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    
    ЗаписатьJSON(ЗаписьJSON, Значение);
        
    Возврат ЗаписьJSON.Закрыть();
66 Юрий Лазаренко
 
14.06.19
16:40
(64) А, ну лан
67 1c_yeah
 
14.06.19
16:42
Всем спасибо!! реально выручили!!
68 Garykom
 
гуру
14.06.19
16:50
(65) У кого какие цензурные комментарии есть етому образцу "кода"?
69 Юрий Лазаренко
 
14.06.19
16:53
(68) Ну там лишние пустые строки после "ЗаписьJSON.УстановитьСтроку();" и "ЗаписатьJSON(ЗаписьJSON, Значение);"
70 Юрий Лазаренко
 
14.06.19
16:53
))))))))))))
71 Garykom
 
гуру
14.06.19
16:54
(69) А где XMLСтрока(Значение) ?
72 1c_yeah
 
14.06.19
16:55
(68) А что не так с ним?
73 1c_yeah
 
14.06.19
16:56
(71) Зачем она?
74 Garykom
 
гуру
14.06.19
16:56
(72) А если в "Значение" есть Симв(0) ?
75 1c_yeah
 
14.06.19
16:57
(74) Ну значение я уже передаю всегда нормальное!!!
76 Garykom
 
гуру
14.06.19
16:58
(75) Судя по лишним Символы.ВК не очень
77 1c_yeah
 
14.06.19
16:58
(76)  Ладно, покажи как правильно писать в таком случае?
78 Garykom
 
гуру
14.06.19
17:04
(77) Так откуда я знаю что у тебя на входе ?
79 Garykom
 
гуру
14.06.19
17:05
(65) очень хреново соотносится с http://v8.1c.ru/o7/201410json/index.htm
80 1c_yeah
 
14.06.19
17:14
(79) На входе как раз структура

http://prntscr.com/o1vd06
81 1c_yeah
 
14.06.19
17:18
Подскажите лучше еще как лучше всего назад теперь преобразовать?

Пока у меня такой способ

    ИмяФайла = ПолучитьИмяВременногоФайла("txt");
    ДвоичныеДанные.Записать(ИмяФайла);    
    
    ЧТ = Новый ЧтениеТекста(ИмяФайла,Кодировка);
    Строка = ЧТ.Прочитать();
82 Garykom
 
гуру
14.06.19
17:25
ЗаписатьJSON(ЗаписьJSON, Структура)

и обратно

Структура = ПрочитатьJSON(ЧтениеJSON);
83 1c_yeah
 
14.06.19
18:07
(82) Двоичные данные в строку я имею ввиду