|
Получить двоичные данные из строки | ☑ | ||
---|---|---|---|---|
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) Или так
|
|||
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
|
||||
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) Двоичные данные в строку я имею ввиду
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |