Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2015.09.20;
Скачать: [xml.tar.bz2];

Вниз

Сжатие данных   Найти похожие ветки 

 
Kerk ©   (2015-01-27 14:20) [0]

Есть небольшая задача, в принципе у меня есть некоторые идеи, но вдруг внезапно что-то свежее и лучшее в этой ветке возникнет.

И так.

Есть ASCII-строка текста (достаточно длинная, допустим 42000 символов). Строка представляет собой запись 16ричного числа, то есть она содержит исключительно символы 0-9 и A-F.

Нужно передать эту строку по сети с одного устройства на другое. И тут начинаются ограничения.

Во-первых, максимальный размер пакета - чуть больше 1000 байт, давайте считать, что просто 1000. То есть в принципе можно порезать строку на 42 части и передать. Но тут возникает второе ограничение - качество соединения так себе, поэтому количество пакетов в идеале нужно свести к минимуму.

Возникает логичная весьма идея - сжать данные. Но тут опять есть пара ограничений.

Передавать нужно строго ASCII-строку. Даже если мы сожмем исходную, то результат все равно должен помещаться в ASCII. Понятно, что в полноценной ASCII-строке больше символов, чем 0-9 и A-F, поэтому потенциал для сжатия есть. Еще один нюанс в том, что принимающая сторона - не ПК, а довольно убогое устройство, поэтому разжатие данных не должно требовать сложных алгоритмов.

Вот так. Мысли?


 
Kilkennycat ©   (2015-01-27 14:23) [1]

когда-то давно подобное обсуждали. что в байт можно без сжатия закодировать почти три символа, если ограничиться только алфавитом и цифрами


 
MBo ©   (2015-01-27 14:23) [2]

какое подмножество ASCII-таблицы (из 256) может использоваться?


 
Eraser ©   (2015-01-27 14:24) [3]


> Вот так. Мысли?

base64 - первое что приходит на ум, без изобретения велосипедов.


 
Kerk ©   (2015-01-27 14:29) [4]


> MBo ©   (27.01.15 14:23) [2]
>
> какое подмножество ASCII-таблицы (из 256) может использоваться?

Все латинские буквы (оба регистра) и цифры.


 
brother ©   (2015-01-27 14:30) [5]

zip сжатие, ну и от повоторв пакета никак не уйти...


 
junglecat ©   (2015-01-27 14:31) [6]

> почти три символа

это как? )


 
Kilkennycat ©   (2015-01-27 14:32) [7]


> Все латинские буквы (оба регистра) и цифры.

а передаем только большой регистр А-F и цифры?


 
Kilkennycat ©   (2015-01-27 14:33) [8]


> junglecat ©   (27.01.15 14:31) [6]
> > почти три символа
>
> это как? )

работает каждый бит.


 
Kerk ©   (2015-01-27 14:33) [9]


> а передаем только большой регистр А-F и цифры?

В исходных данных только большой A-F и цифры.
В запакованном виде могут использоваться большие/маленькие A-F и цифры.


 
Kerk ©   (2015-01-27 14:34) [10]

В исходный данных закодировано 16тиричное число, поэтому регистр просто неважен. Можно свести все к upper case (или lower, кому как нравится) без потери информации.


 
MBo ©   (2015-01-27 14:43) [11]

>Все латинские буквы (оба регистра) и цифры.
если есть возможность добавить еще три символа, то получится вариант base-64 со сжатием исходной строки в полтора раза. Вероятно, это самый простой вариант для тупого приемника


 
Jeer ©   (2015-01-27 15:42) [12]

Тут вступает в силу теория кодов с коррекцией/исправлением ошибок в канале передачи.

Оно надо?


 
Kilkennycat ©   (2015-01-27 16:10) [13]

ну, очень небольшое сжатие просто получается:
доступные нам для передачи:
30 31 32 33 34 35 36 37 38 39
41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a
61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a


тут сразу видно, что вторая цифра в

41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50
61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70

уже достаточно информативна.
примем первые 4 и 5 за ноль, 6 и 7 за единицу.
для передачи 16 знаков достаточно 4 бита.
то есть, передав любые 4 символа из

41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50
61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70

мы передаем пятый.


 
Kilkennycat ©   (2015-01-27 16:17) [14]

можно увеличить сжатие (непрогнозируемо), использовав оставшиеся для каких-то правил.
например, передача 51 52 53 54 55 56 57 58 59 5a (тут а = 0) означает передачу 11 22 33 44 55 66 77 88 99 00


 
Kilkennycat ©   (2015-01-27 16:19) [15]

ну а семерки для аа bb cc dd ee ff


 
кгшзх ©   (2015-01-27 17:11) [16]

упаковать исходное в четырех битную кодировку
сжать упакованное
base64 на сжатое


 
Rouse_ ©   (2015-01-27 19:58) [17]


>  Еще один нюанс в том, что принимающая сторона - не ПК,
> а довольно убогое устройство, поэтому разжатие данных не
> должно требовать сложных алгоритмов.

Пожалуй, нужно начать с этого момента.
А так-то конечно пожать, хоть через RLE можно.


 
имя   (2015-01-27 20:29) [18]

Удалено модератором


 
Kerk ©   (2015-01-27 20:37) [19]

Удалено модератором


 
Kerk ©   (2015-01-27 20:40) [20]


> Kilkennycat ©   (27.01.15 16:10) [13]

Я, честно говоря, не очень понял твою идею.


 
Дмитрий С ©   (2015-01-27 21:07) [21]

Я бы сделал контроль целостности каждого пакета отдельно и передавал бы пока не передастся.

Ну и возможно преобразовал бы hex->bin->base64 - на треть сократились бы данные


 
Kerk ©   (2015-01-27 21:12) [22]

Целостность каждого пакета и так проверяется, там контрольная сумма передается.
А base64 похоже нормальный вариант. О нем думал сначала, но сомневался, вдруг что-то еще бы придумали.


 
Kilkennycat ©   (2015-01-27 21:13) [23]

пример:
кодируем 120AB
1 - 0x61
2 - 0x42
0 - 0x70
A - 0x6A
B = в 4-х битной кодировке 1011, то есть 6 4 7 6


 
Sha ©   (2015-01-27 21:24) [24]

> Kerk ©   (27.01.15 14:20)  
> Строка представляет собой запись 16ричного числа

значения всех битов этого числа равновероятны?


 
Pavia ©   (2015-01-27 21:29) [25]

символы 0-9 и A-F. Т.е алфавит у вас 16 символов.  4 бита и того сжатие в 2 раза. Ещё поверх можно математическим кодирование ешё в 2 раза.
Табличка и математические операции с масками.  Максимум в 2 раза.
Ещё повторы пар символов. Но тут нужен словарь. Тут тоже до 2-х раз.
Собственно всё сильнее не сожмёте. Если хотите сильнее то нужны дополнительные данные.

Советую прочитать:
Лидовский В.В., Теориинформации, 2003


 
DVM ©   (2015-01-27 22:49) [26]


> Kerk ©   (27.01.15 14:20) 


> Но тут возникает второе ограничение - качество соединения
> так себе, поэтому количество пакетов в идеале нужно свести
> к минимуму.

Вообще то при плохом канале количество пакетов надо увеличивать, а их размер уменьшать, что собственно и делает TCP, иначе при каждом ретрансмишене надо будет пересылать слишком большой кусок данных и вероятность его повреждения выше.


 
Dimka Maslov ©   (2015-01-27 23:37) [27]

Есть у меня код на сях, которые четырёхбайтовые последовательности преобразует в пятибайтовые с символами в диапазоне от 32 до 126. Итого получается увеличение объёма на 25%, а не на 50, как при base64. Так-что после ужатися можно и его применить. У жать можно тем же zlibом, если он ещё поддерживается в delphi.


 
Dimka Maslov ©   (2015-01-27 23:41) [28]

Нашёл:

typedef char FIVECHARS[5];

void EncodeInt(DWORD Value, FIVECHARS &Buffer)
{
for (int i=0; i<5; i++)
{
 int Rem = Value % 86;
 Value /= 86;
 Buffer[i] = 126 - Rem;
}
}

DWORD DecodeInt(FIVECHARS &Buffer)
{
DWORD Base = 1;
DWORD Result = 0;
for (int i=0; i<5; i++)
{
 Result += Base * (126 - Buffer[i]);
 Base *= 86;
}
return Result;
}


 
Sha ©   (2015-01-28 01:30) [29]

> Dimka Maslov ©   (27.01.15 23:41) [28]

а чем 85 не понравилось? )


 
Труп Васи Доброго ©   (2015-01-28 08:51) [30]

Проще всего не коитировать мозг, а сделать нормальный канал связи (хоть 3G/4G модем).
Ну и моя самая простая из всех идея - если число не особо меняется, то передавай только изменения в строке. То есть один раз (на флешке) передали число, а потом передаёшь только порядковый номер изменившейся цифры и её значение. Как-то так.


 
Kilkennycat ©   (2015-01-28 09:43) [31]


> Проще всего не коитировать мозг, а сделать нормальный канал
> связи (хоть 3G/4G модем).

ты живешь на другой планете?


 
Dimka Maslov ©   (2015-01-28 10:01) [32]


> Sha ©   (28.01.15 01:30) [29]


Вспоминая анекдот про Штирлица скажу. Нет, должно быть 86! :)


 
Труп Васи Доброго ©   (2015-01-28 10:16) [33]


> ты живешь на другой планете?

Ну так не сказано в чём проблема связи, может просто не догадались до модема :)
Я живу в Урюпинске. Здесь всего 10 лет назад единственным видом интернета был диалап, с часовым дозвоном и обрывом связи через 3-5 минут. Зато сейчас у всех эти "свистки" (модемы) есть. Где связь хреновая, их подвешивают скотчем к потолку/окну, а через USB-удлинитель соединяют с компом. Если уж у нас такая связь работает, то где её нет? Да и какой смысл изобретать костыли, если через год-два, наладят связь и всё будет шикарно?
В любом случае, какой бы ты хитрый способ сжатия ни придумал, нужна связь, чтобы передать данные, так может лучше думать в сторону улучшения канала?


 
DVM ©   (2015-01-28 12:03) [34]


> Труп Васи Доброго ©   (28.01.15 10:16) [33]


> Если уж у нас такая связь работает, то где её нет?

Сотовая связь только в обжитых местах. Погляди на карту России в районе Сибири. Нет там ничего.
Например, на некой трубе длиной 200 км через N километров стоят датчики. Питание там есть, а вот связи нет. А информацию надо оперативно собирать. На каждый датчик по станции сотовой связи не поставишь, поэтому организуются медленные и не особенно надежные каналы связи с последовательным доступом и т.д. Примеров масса.


 
Kerk ©   (2015-01-28 12:27) [35]

Я б с удовольствием протянул до каждого девайса 100мегабитный ethernet :), но реальность вот такая вот. Девайсы сделаны не мной и не вчера. Если их начинать менять, то это определенная воля нужна и бюджет. Сколько, например, стоит пара сотен 3g-модемов? Я лично не в курсе. Например, есть требование, что девайс должен работать строго от солнечной батареи. Не погубит ли эту затею мощный модем? Я опять не в курсе. Короче, работаю с тем, что есть.


 
картман ©   (2015-01-28 12:34) [36]

а строку нельзя уменьшить?))


 
Kilkennycat ©   (2015-01-28 13:59) [37]


> девайс должен работать строго от солнечной батареи. Не погубит
> ли эту затею мощный модем?

не погубит, в космосе спутники на таких батареях намного мощнее живут :)


 
Kerk ©   (2015-01-28 14:00) [38]

Ну там и батареи наверно огого :)


 
Труп Васи Доброго ©   (2015-01-28 16:41) [39]


> Сколько, например, стоит пара сотен 3g-модемов?

Не знаю, наша контора их закупает и ставит десятками тысяч, причём даже там, где нет связи Мегафона, а симки по контракту должны быть только мегафоновские. Вот такие реалии бизьнеса по русски. Естественно, что нифига потом не рабтает, но главное что деньги освоены.

> Не погубит ли эту затею мощный модем?

Ну а сейчас то какой способ связи? Какой канал используется? Часты ли сеансы связи? И главное - данные в строке сильно меняются? Я к тому, то передавать не всю строку, а только изменённые участки.

> через N километров стоят датчики. Питание там есть, а вот
> связи нет.

Не смешите мои носки. Откуда питание? ЛЭП протянута? Значит можно и связь организовать (передатчик/радиостанцию/спутниковый телефон) Если это дорого, значит и данные не особо важные/критические. Да и опять же сколь важна точность этих данных? Да и какие данные могут быть на трубе??? Давление замеряется на каждой компрессорной станции, по его разнице между станциями вычисляется объём прошедшего газа и объём потерь в пути. Если этот объём в пределах расчётной нормы, то всё ништяк, если больше, то кричат "АЛЯРМ" и выезжают с "осмотром" трубы. Вот и вся песня. Никаких датчиков на трубе в тайге нет и не требуется.

> Примеров масса.

Хоть один реальный пожалуйста.


 
Kilkennycat ©   (2015-01-28 22:04) [40]

есть другие реальные примеры. одна компания выиграла тендер на установку и дальнейшее обслуживание пожарно-охранной сигнализации. Оборудование уже было закуплено. несколько тысяч штук.  Меня приглашали осмотреть и что-нить изобрести, потому что там хоть и был 3Г модем, работало все это мерзко, так разработчику оторвали руки и ноги и пришили не в том порядке, а мож и не пришили, ушами делал, а думать ваще нечем было. Новое оборудование еще раз никто не купит.
Меня приглашали и в другие конторы, где надо было модернизировать какую-нить хрень, потому что новую никто не купит.
Ну, мож в каких-то богатых регионах дела несколько иным образом устроены, но мой опыт показывает, что в большинстве случаев новое не купят.
И не потому, что не хотят.

> Kerk ©   (28.01.15 12:27) [35]
> Сколько, например, стоит пара сотен
> 3g-модемов?

если обычных усб-свистков, то 12-15 долларов за модем. итого примерно 170 тысяч рублей
если промышленные, то 50-100 долларов за модем. итого примерно миллион рублей.
мелочь. а расходы на переоборудование - да ими ваще можно пренебречь, людям за счастье переделать что-то.


 
DVM ©   (2015-01-28 22:42) [41]


> Труп Васи Доброго ©   (28.01.15 16:41) [39]

Я привел гипотетический пример того, когда может понадобится связь там, где нет сотовой сети. Таких мест больше чем ты думаешь. Метео-станции, мониторинг авто, жд транспорта и судов и т.д.

Теперь реальные примеры.

В настоящий момент я частично задействован в одном проекте, связанном с мониторингом состояния станций коррозионной защиты на газопроводах. Пилотный проект делается на Комсомольском ЛПУ (г. Югорск). Так вот, одним из важнейших параметров, которые надо мерять по всей длине трубы - скорость коррозии. Через некоторое расстояние к трубе грубо говоря подключены датчики, выходы которых выведены на небольшие столбики, которые расположены по всей длине трубы. Эти столбики были там еще при царе горохе, так что датчики вдоль трубы все же есть и всегда были. Кроме этого там можно замерить всякие потенциалы и прочее. Это оборудование пассивно в массе своей. В данный момент замеры производятся обходчиком, что крайне сложно и делается редко, т.к. расстояния огромны, а условия суровые. Ситуацию спасает то, что коррозионные процессы тоже не быстрые. Было принято решение автоматизировать процесс. Для этого на те же столбики устанавливаются контроллеры с очень малым энергопотреблением, снимающие показания и передающие по цепочке с некоторым резервированиям на станции катодной защиты, которые расположены далеко друг от друга. Предавать можно как по радио, так и по самой трубе. Сотовой связи там нет и не будет никогда. По поводу питания. Это конечно проблема. Нельзя сказать, что его там совсем нет. Станция коррозионной защиты подает на трубу и закопанный вдоль электрод весьма ощутимое напряжение - до 100 вольт. Конечно напряжение сильно падает с расстоянием, но 3-5 вольт всегда можно снять. Но это напряжение нестабильно. Поэтому дополнительно рассматриваются в данный момент разные схемы вплоть до солнечных батарей и т.д. Вот такие дела. А ты говоришь 3g модемы.

Из реальных примеров еще могу рассказать про мониторинг автотранспорта через ныне почившую спутниковую систему спейсчекер.


 
Pavia ©   (2015-01-28 23:22) [42]

Удалено модератором


 
Германн ©   (2015-01-29 01:53) [43]


> DVM ©   (28.01.15 12:03) [34]
>
>
> > Труп Васи Доброго ©   (28.01.15 10:16) [33]
>
>
> > Если уж у нас такая связь работает, то где её нет?
>
> Сотовая связь только в обжитых местах. Погляди на карту
> России в районе Сибири.

Почему обязательно Сибирь? Уже в Поволжье есть проблемы.


 
Германн ©   (2015-01-29 01:55) [44]

Удалено модератором


 
Германн ©   (2015-01-29 01:57) [45]


> Kilkennycat ©   (28.01.15 13:59) [37]
>
>
> > девайс должен работать строго от солнечной батареи. Не
> погубит
> > ли эту затею мощный модем?
>
> не погубит, в космосе спутники на таких батареях намного
> мощнее живут.

Конечно живут. Но за какие деньги!


 
SOFT_FOR_YOU ©   (2015-01-29 11:20) [46]

За основу берем либо текст, либо hex -> bin

Потом сжимаем. Лучше ZLib, если не получится, то например LZO. У меня валяется такая реализация, если процессор не x86 - можно искать исходники.

function lzo_compress(const Source; SourceSize: LongInt; const Dest; var DestSize: LongInt; var WorkBuf): LongInt; cdecl;
asm
 pop ebp
 lea eax, @dest + $2F0
 jmp eax
@dest:
 DD $83EC8B55,$5653E8C4,$C458B57,$308558B,$FC5589D0,$89F3C283,$458BF855,$F4458918,$8 B10558B
 DD $F08B0845,$3304C083,$8ADB33C9,$588A0348,$6E1C102,$DB33CB33,$8A05E1C1,$CB330158,$ E1C1DB33
 DD $33188A05,$C1D98BCB,$CB0305E1,$8105E9C1,$3FFFE1,$EC4D8900,$8BF44D8B,$C8BEC5D,$3B D98B99
 DD $7E72085D,$FB2BF88B,$85F07D89,$817376FF,$BFFFF07D,$6A770000,$F07D81,$76000008,$3 598A51
 DD $7403583A,$EC4D8B49,$7FFE181,$F1810000,$201F,$8BEC4D89,$5D8BF44D,$990C8BEC,$5D3B D98B
 DD $8B377208,$89FB2BF8,$FF85F07D,$7D812C76,$BFFFF0,$81237700,$800F07D,$A760000,$3A0 3598A
 DD $2740358,$8B6610EB,$183B6619,$598A0875,$2583A02,$4D8B1874,$EC5D8BF4,$40990489,$F F8453B
 DD $1D883,$FF25E900,$5D8BFFFF,$EC7D8BF4,$8BBB0489,$85DE2BD8,$89567EDB,$7D83E85D,$87 703E8
 DD $8E85D8A,$3AEBFE5A,$12E87D83,$5D8A0B77,$3EB80E8,$EB421A88,$E87D8B29,$420002C6,$8 112EF83
 DD $FFFF,$81127600,$FFEF,$2C600,$FFFF8142,$77000000,$88DF8BEE,$1E8A421A,$421A8846,$ 75E84DFF
 DD $3C083F5,$4003598A,$75FF583A,$4598A2D,$FF583A40,$598A2475,$583A4005,$8A1B75FF,$3 A400659
 DD $1275FF58,$4007598A,$75FF583A,$8598A09,$FF583A40,$8B487674,$81CE2BC8,$800F07D,$F 18B0000
 DD $4DFF2577,$49CE8BF0,$8A05E1C1,$E380F05D,$2E3C107,$A88CB0A,$F04D8B42,$8803E9C1,$F 2E9420A
 DD $81000000,$4000F07D,$13770000,$8BF04DFF,$2E980CE,$8820C980,$C1E9420A,$81000000,$ 4000F06D
 DD $4D8B0000,$81DE8BF0,$4000E1,$2EB8000,$800BE9C1,$CB0A10C9,$E9420A88,$9C,$83FC7D8B ,$2EB09C1
 DD $F83B4041,$198A0676,$F474183A,$CE2BC88B,$7D81F18B,$4000F0,$FF1E7700,$FE83F04D,$8 B0D7721
 DD $2E980CE,$8820C980,$64EB420A,$C621EE83,$EB422002,$F06D813C,$4000,$7709FE83,$F04D 8B1B
 DD $E181DE8B,$4000,$C102EB80,$C9800BE9,$88CB0A10,$34EB420A,$8B09EE83,$E181F04D,$400 0
 DD $800BE9C1,$A8810C9,$FFFE8142,$76000000,$FFEE8112,$C6000000,$81420002,$FFFE,$8BEE 7700
 DD $420A88CE,$80F04D8A,$E1C13FE1,$420A8802,$C1F04D8B,$A8806E9,$3BF08B42,$573F845,$F FFD52E9
 DD $10552BFF,$8914458B,$FC458B10,$5E5FC62B,$5DE58B5B,$909090C3,$53EC8B55,$758B5756, $C7D8B10
 DD $FF83DE8B,$8B04770D,$8B1BEBC7,$8B521855,$5351144D,$8458B57,$FCE6E850,$C483FFFF,$ 14558B14
 DD $C0851A03,$4D8B6676,$2BCF0308,$8BF33BC8,$3D1175F9,$EE,$D08B0A77,$8811C280,$3FEB4 313
 DD $7703F883,$FE430805,$F88335EB,$8B0A7712,$3E980C8,$EB430B88,$C6D08B26,$83430003,$ FA8112EA
 DD $FF,$EA811276,$FF,$430003C6,$FFFA81,$EE770000,$8A431388,$B88470F,$F7754843,$4311 03C6,$430003C6
 DD $430003C6,$458BDE2B,$33188914,$5B5E5FC0,$9090C35D
end;

function lzo_decompress(const src; srclen: LongInt; const dst; var dstlen: LongInt): LongInt; cdecl;
asm
 DB $51
 DD $458B5653,$C558B08,$F08BD003,$33FC5589,$144D8BD2,$68A1189,$3C10558B,$331C7611,$8 3C88AC9
 DD $8346EFC1,$820F04F9,$1C9,$8846068A,$75494202,$3366EBF7,$460E8AC9,$F10F983,$8D83, $75C98500,$8107EB18
 DD $FFC1,$3E804600,$33F47400,$83068AC0,$C8030FC0,$83068B46,$28904C6,$4904C283,$F983 2F74,$8B217204,$83028906
 DD $C68304C2,$4E98304,$7304F983,$76C985EE,$46068A14,$49420288,$9EBF775,$8846068A,$7 5494202,$8AC933F7
 DD $F983460E,$C12B7310,$828D02E9,$FFFFF7FF,$C933C12B,$C1460E8A,$C12B02E1,$8840088A, $88A420A,$420A8840
 DD $288008A,$113E942,$F9830000,$8B207240,$FF428DD9,$8302EBC1,$C32B07E3,$1E8ADB33,$3 E3C146,$2B05E9C1
 DD $D9E949C3,$83000000,$2F7220F9,$851FE183,$EB1875C9,$FFC18107,$46000000,$74003E80, $8AC033F4,$1FC08306
 DD $F46C803,$FBC11EB7,$FF428D02,$C683C32B,$8369EB02,$457210F9,$D98BC28B,$C108E383,$ C32B0BE3,$8507E183
 DD $EB1875C9,$FFC18107,$46000000,$74003E80,$8ADB33F4,$7C3831E,$F46CB03,$FBC11EB7,$8 3C32B02,$D03B02C6
 DD $9A840F,$2D0000,$EB000040,$2E9C11F,$2BFF428D,$8AC933C1,$E1C1460E,$8AC12B02,$A884 008,$88008A42
 DD $51EB4202,$7206F983,$2BDA8B37,$4FB83D8,$188B2E7C,$8904C083,$4C2831A,$8B02E983,$8 31A8918,$C08304C2
 DD $4E98304,$7304F983,$76C985EE,$40188A20,$49421A88,$15EBF775,$8840188A,$188A421A,$ 421A8840,$8840188A
 DD $7549421A,$8AC933F7,$E183FE4E,$FC98503,$FFFE4284,$46068AFF,$49420288,$C933F775,$ E9460E8A,$FFFFFECA
 DD $8B10552B,$10891445,$75FC753B,$EBC03304,$FFF8B80D,$753BFFFF,$830372FC,$5B5E04C0, $90C35D59
end;
             
procedure LzoCompress(const inBuf: pointer; const inBytes: integer; out outBuf: pointer; out outBytes: integer);
var
 WorkBuf: array[word] of byte;
begin
 outBytes := inBytes + ((inBytes div 1024) + 1) * 16;
 GetMem(outBuf, outBytes);
   lzo_compress(inBuf^, inBytes, outBuf^, outBytes, WorkBuf);
 ReallocMem(outBuf, outBytes);
end;

procedure LzoDecompress(const Source: Pointer; SourceSize: integer; const Dest: pointer; var DestSize: integer);
begin
 lzo_decompress(Source^, SourceSize, Dest^, DestSize);
end;


Ну а в результате отправляем Base64


 
Sha ©   (2015-01-29 12:05) [47]

> Ну а в результате отправляем Base64

почему не Base85?


 
Kerk ©   (2015-01-29 12:10) [48]


> SOFT_FOR_YOU ©   (29.01.15 11:20) [46]

Я как раз думал о ZLib. Вчера как раз об этом говорил об этом с людьми, которые делают принимающая часть. Сжать-то я смогу - твоим кодом или каким-нибудь другим - а разжать "приемник" не сможет, по их словам они не нашли для своей платформы никаких библиотек для архивации/разархивации. Может обманывают, не знаю. Остановлюсь в итоге на перекодировке в BaseКакоеНибудьЧисло, думаю.


 
Kerk ©   (2015-01-29 12:11) [49]


> Труп Васи Доброго ©   (28.01.15 16:41) [39]
> И главное - данные в строке сильно меняются?

Сеансы не частые - раз в несколько часов максимум. Но данные в строке могут совершенно произвольно меняться, так что передать только изменение не выйдет.


 
Kerk ©   (2015-01-29 12:14) [50]


> Kilkennycat ©   (28.01.15 22:04) [40]
> мелочь. а расходы на переоборудование - да ими ваще можно
> пренебречь, людям за счастье переделать что-то.

Вот ты интересный человек. Сам абзацем выше пишешь, что по твоему опыту никто новое не купит. Вот и приходится жить с тем, что есть.

Можно конечно занять позицию "вы все дураки и не лечитесь, а я тут весь в белом стою... пока не поменяете железо, софт писать не буду!". Но боюсь, это плохо для меня кончится :)

Разговор уже куда-то не в ту степь ушел :)


 
SOFT_FOR_YOU ©   (2015-01-29 12:14) [51]

> Kerk ©   (29.01.15 12:10) [48]

Если ты сжимаешь текст - то словарная компрессия может дать профит x10
А по поводу принимающей стороны... Нужно просто найти исходники LZO_Decompress и реализовать на том языке, который им доступен. Видишь - какая компактная реализация. Мне сказали, что это откомпилированный C-код


 
Kilkennycat ©   (2015-01-29 12:59) [52]


> Kerk ©   (29.01.15 12:14) [50]
> Вот ты интересный человек.

ниже было с сарказмом :) или иронией - никогда не знал значений этих.

а что за платформа у девайса?


> реализовать на том языке, который им доступен. Видишь -
> какая компактная реализация. Мне сказали, что это откомпилированный
> C-код

не читал историю про нехватку 1 байта? мож у них там PIC10F200 - 384 байта флэша.


 
кгшзх ©   (2015-01-29 13:11) [53]

паставьте на той (слабой) стороне прокси перед пик"ом
он и будет входящее расжимать а исходящее жамкать.


 
Kilkennycat ©   (2015-01-29 17:50) [54]


> кгшзх ©   (29.01.15 13:11) [53]
>

кстати, да.

и это устройство довольно-таки простое, я даже готов произвести две-три сотни штук, при такой партии выйдет не дороже 300 рублей за штуку и полная гибкость в передаче информации.


 
Kilkennycat ©   (2015-01-29 19:55) [55]

посчитал немного: бескорпусно по i2c (принятое отдается новому мк, он преобразует и возвращает) стоимость 130 рублей.
аппаратная модернизация 200 устройств обойдется в 26 000 руб, плюс расходы на то, что кому-то  надо вставить платку размером 10х15 мм в устройство и припаять 4 провода...  
дорогова-то все же, чем только программное решение


 
Sha ©   (2015-01-30 09:21) [56]

> Kerk ©   (29.01.15 12:10) [48]
> Остановлюсь в итоге на перекодировке в BaseКакоеНибудьЧисло, думаю.

Подумай еще немного )
Вчера нашел-таки среди своих старых завалов одну из Basе-кодировок. Скоро причешу и выложу в общий доступ.
Должна получиться удобной и быстрой.


 
KSergey ©   (2015-01-30 10:08) [57]

Тут бы провести эксперимент, показывающий процент потерь данных и их характер.
Если при проблемах теряются пакеты целиком или в битых пакетах по факту портится обычно бы 30..40% информации - то не важно как скодировать, но пакеты дешевле перепосылать целиком.

А если обычно в битых пакетах искажаются лишь отдельные биты - то наверное будет предпочтительнее коды с коррекцией данных. (тут, правда, опять надо смотреть характер: одно дело несколько разбросанных по всей длине пакета битов исказилось - тогда коррекция спасает, другое дело кучно исказились рядомстоящие - тогда коррекция не спасёт ну или предварительно надо логически радомстоящие раскидывать по длине, что усложняет)

Речь просто о статистике, которую надо репрезентативно собрать, конечно. Потому что просто слова "ненадёжный канал" - они так скажем мало о чем.

Сами алгоритмы кодирования/декодирования в любом случае весьма простые будут, непременно заморачиваться какими-то там библиотеками - смысла особого нет, по-моему, раз уж мы о реализации передачи на таком низком уровне говорим.


 
Дмитрий С ©   (2015-01-30 10:17) [58]


> Kilkennycat ©   (29.01.15 19:55) [55]

Неужели платка будет стоить 130 в итоге?


 
Kilkennycat ©   (2015-01-30 10:52) [59]


> Дмитрий С ©   (30.01.15 10:17) [58]

да, немного дороговато, но я же тоже должен что-то заработать.


 
brother ©   (2015-01-30 11:25) [60]

а чистая цена сколько?)


 
Kilkennycat ©   (2015-01-30 11:49) [61]


> brother ©   (30.01.15 11:25) [60]

STM8S003F3P6 - 33 рубля
кварц - 30 рублей
кучка резисторов и кондюков - 1 рубль
плата от 10 до 20 рублей (в зависимости от сроков)
пайка ручная 1,5 рубля за точку - около 30 рублей

итого от 103 до 113 руб. + 10% на прибыль и расходы на доставку


 
brother ©   (2015-01-30 11:55) [62]

Удалено модератором


 
KSergey ©   (2015-01-31 12:43) [63]

> Kilkennycat ©   (30.01.15 11:49) [61]

Это о какой партии речь?


 
Inovet ©   (2015-01-31 14:15) [64]

> [61] Kilkennycat ©   (30.01.15 11:49)
> пайка ручная 1,5 рубля за точку

Ручная дешевле или партия мала для автоматической?


 
Kilkennycat ©   (2015-01-31 14:48) [65]


> KSergey ©   (31.01.15 12:43) [63]

200 штук


> Inovet ©   (31.01.15 14:15) [64]

ручная дороже.
примерный список цен ручной пайки:
Количество точек пайки в заказе Цена монтажа за точку пайки
0 - 500                                        3,00
501 - 1 000                                  2,50
1 001 - 5 000                                2,00
5 001 - 10 000                               1,50
10 001 - 100 000                            0,80
Более 100 000 по запросу

я беру 1.5, так как брать 3 - очень дорого выходит.

для автоматической мала не партия, а стоимость.
цена пайки автоматической:

Количество точек пайки в заказе Цена монтажа за точку пайки
30 000 - 50 000                            0,50
50 001 - 100 000                          0,35
100 001 - 250 000                          0,25
250 001 - 700 000                         0,18
700 001 - 1 000 000                     0,15

но: подготовка производства для каждой стороны платы может составить 15000 рублей.


 
Kilkennycat ©   (2015-01-31 14:50) [66]

вот и получается, что если при ручном монтаже стоимость 200 штук 26000 руб, то с автоматическим получится в два раза дороже.


 
Inovet ©   (2015-01-31 16:56) [67]

> [66] Kilkennycat ©   (31.01.15 14:50)

Таки, партия мала, выходит.


 
Kilkennycat ©   (2015-01-31 17:16) [68]


> Inovet ©   (31.01.15 16:56) [67]

нет. если одна платка будет стоить 100 тысяч, можно отдать 15 за автомат, тем более, что проект хранят, вторая платка уже без 15 будет.


 
Inovet ©   (2015-01-31 18:06) [69]

Удалено модератором


 
Kilkennycat ©   (2015-01-31 18:45) [70]

Удалено модератором


 
Sha ©   (2015-02-01 22:05) [71]

вот тут не дал потеряться еще одной Base-кодировке:

http://guildalfa.ru/alsha/node/30



Страницы: 1 2 вся ветка

Форум: "Прочее";
Текущий архив: 2015.09.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.67 MB
Время: 0.004 c
2-1398678838
Николька
2014-04-28 13:53
2015.09.20
Firebird SQL error code = -104


1-1332840993
IGray
2012-03-27 13:36
2015.09.20
Посоветуйте скриптовый движок для Delphi


15-1422739804
Юрий
2015-02-01 00:30
2015.09.20
С днем рождения ! 1 февраля 2015 воскресенье


15-1422882243
ВладОшин
2015-02-02 16:04
2015.09.20
Set|Get CursorPos при закрытом окне RDP


3-1305530024
Aybolit
2011-05-16 11:13
2015.09.20
Paradox 3.5





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский