- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
protected static long chr2hex(char a)
{
switch (a)
{
case '0':
return 0L;
...................
case '9':
return 9L;
case 'A':
case 'a':
return 10L;
.....................
case 'F':
case 'f':
return 15L;
}
return 0L;
}
krypt 25.03.2013 15:31 # 0
bormand 25.03.2013 16:06 # +3
В обычный int может не поместиться?
DBdev 25.03.2013 19:39 # +2
bormand 25.03.2013 20:35 # +9
absolut 25.03.2013 21:59 # +1
bormand 25.03.2013 22:18 # 0
guest 10.05.2013 04:06 # 0
guest 26.03.2013 04:40 # 0
А так я уже валяюсь от полного перебора алфавита и чисел.
Lure Of Chaos 26.03.2013 11:13 # 0
Ccik 26.03.2013 11:32 # −3
bormand 26.03.2013 11:34 # 0
defecate-plusplus 26.03.2013 11:36 # +2
причем буквы дальше F как бы должны вернуть 0
bormand 26.03.2013 13:45 # +5
Вот так вот и рождается код, который потом в качестве хекс чисел принимает всякие chucknorris и zeleniy.
Сорри за хабр, но другую ссылку по теме искать влом: http://habrahabr.ru/post/173727/
real_escape_string 13.05.2019 08:48 # 0
nemyx 13.05.2019 20:42 # 0
bormand 13.05.2019 20:45 # 0
nemyx 13.05.2019 20:48 # 0
bormand интерпретируется как #b000a0 = b0*красный + a0*синий.
nemyx 13.05.2019 20:51 # 0
Если браузер не сможет интерпретировать такой цвет, то он его проигнорирует.
Хуже будет, если придёт кто-нибудь с ником ffffff: его имя будет белым на белом.
guest8 13.05.2019 20:53 # −999
guest8 13.05.2019 21:16 # −999
guest8 13.05.2019 21:20 # −999
nemyx 13.05.2019 21:37 # 0
guest8 13.05.2019 21:43 # −999
nemyx 13.05.2019 21:49 # 0
guest8 13.05.2019 21:55 # −999
guest8 13.05.2019 21:57 # −999
guest8 13.05.2019 22:02 # −999
Web_Monkey 13.05.2019 22:03 # 0
guest8 13.05.2019 22:08 # −999
cmepmop 13.05.2019 22:15 # 0
guest8 13.05.2019 22:19 # −999
guest8 13.05.2019 22:21 # −999
Web_Monkey 13.05.2019 22:31 # +2
guest8 13.05.2019 22:54 # −999
guest8 13.05.2019 22:57 # −999
guest8 13.05.2019 22:58 # −999
guest8 13.05.2019 22:25 # −999
guest8 13.05.2019 22:26 # −999
guest8 13.05.2019 22:26 # −999
guest8 13.05.2019 22:29 # −999
guest8 13.05.2019 22:27 # −999
3oJIoTou_xyu 14.05.2019 13:41 # 0
хуй
guest8 13.05.2019 22:28 # −999
Web_Monkey 13.05.2019 22:36 # 0
Web_Monkey 13.05.2019 21:24 # 0
guest8 13.05.2019 21:25 # −999
AHCKujlbHblu_netyx 13.05.2019 22:18 # 0
guest8 13.05.2019 23:06 # −999
guest8 13.05.2019 23:09 # −999
BECEHHEE_O6OCTPEHuE 14.05.2019 10:37 # 0
guest 26.03.2013 12:51 # −1
Имхо, тоже говнокод.
miscff 27.03.2013 22:50 # 0
bormand 27.03.2013 23:14 # +3
defecate-plusplus 27.03.2013 23:31 # +3
nemyx 13.05.2019 21:50 # 0
3.14159265 28.03.2013 15:25 # +2
> Char.IsDigit(a)
И сразу фейл.
В стиле си брать чары из массива по 4 и конвертировать их в intе пачками по 2 или 4. В 64-х битном режиме скорость и того больше.
К сожалению ни в жабе, ни в шарпе так стрелять нельзя. Чтоб быдло не стало БЕ3НОГNM
roman-kashitsyn 28.03.2013 15:41 # +2
defecate-plusplus 28.03.2013 16:34 # 0
кстати, наброса ради, приведу канонiческую реализацию от CRT моей MSVC 9.1 понятное дело, что тут мегафункция, парсящая охулиард форматов и пацанам просто западло что-то сверхоптимизировать, но лично я для такой мегаузкой задачи, как конверт символа в ниббл написал бы статическую таблицу [256], в которой тупо в нужной ячейке лежит нужный результат
bormand 28.03.2013 18:29 # 0
3.14159265 28.03.2013 18:33 # 0
Малаца, хорошо зделали. Я только хтел сказать что не надо проверять верхние и нижние отдельно.
В ниббл сконвертить можно так
Или я ебанулся? Думаю кто-то уже должен был до такого додуматься.
http://ideone.com/yT0BM9
Парсинг - сложней. Нужно подрочиться с инвалидными значениями и нулями. Но тоже возможно.
На 64-битном MMX регистре можно перегонять int32.
А на SSE и вовсе 64-разрядные значения с явным профитом.
3.14159265 28.03.2013 18:47 # 0
>m += (m<<2)+(m<<1)
fix:
Хотя можно еще улучшить. Можно еще флаг ввести, который будет отвечать за большие/маленькие, но я сходу простого способа без ветвлений не вижу.
defecate-plusplus 28.03.2013 19:02 # 0
это и есть - чар в ниббл
поставим четкие условия - надо из строки "67af" получить uint16_t 0x67af
3.14159265 28.03.2013 20:27 # 0
В SSE-регистрах это криво, потому что должно быть выровнено по байтам (который минимальная единица адресации): 0x06070a0f.
Но сдвигами это фиксится на раз.
>поставим четкие условия - надо из строки "67af" получить uint16_t 0x67af
Если я привел наглядный пример, то думаю не составит труда его обратить. Или вы думаете что обратный процесс сильно сложней?
Как я уже сказал его могут усложнить только проверки диапазонов.
>лично я для такой мегаузкой задачи, как конверт символа в ниббл написал бы статическую таблицу [256]
Но мы говорим в общем как делают "в стиле С". Понятно что для именно этой задачи, с вероятностью 95% этот hex пойдет в буфер и на вывод (который в тысячи раз тормознутей), то оптимизация не особо нужна.
Я же говорю об общем подходе - "в стиле С".
defecate-plusplus 28.03.2013 20:57 # 0
наоборот, из буфера читаем символ
раз уж мы тут обсуждаем SSE и обработку пачками, очевидно, что данные лежат в символьном виде в оперативе в удобном для обработки виде, тысячи их
допустим все по 8 символов, которые превращаются uint32_t, если тебе удобней - по 4 символа, которые превращаются в uint16_t
нелегальных символов нет
это не по правилам - но допустим, что вообще всё только в нижнем/верхнем (ненужное зачеркнуть) регистре
вот мне праздно интересно, даст ли молотилка SSE вообще профит перед решением в лоб (арифметический char -> nibble, скажем return ch < 'A' ? ch - '0' : ch - 'A' + 10; плюс 8(4) сдвига аккумулятора на << 4)
вопрос не тебе, а он вообще, риторический
3.14159265 28.03.2013 20:57 # 0
>что вообще всё только в нижнем/верхнем (ненужное зачеркнуть) регистре
Она понимает регистры. У Борманда судя по этому 0x20202020 - тоже.
https://ideone.com/L3Ktdg
>вот мне праздно интересно, даст ли молотилка SSE вообще профит перед решением в лоб
Да. Всего 8 комманд. Никаких ветвлений.
И обрабатываем сразу 16 байт.
defecate-plusplus 28.03.2013 21:07 # +3
3.14159265 28.03.2013 21:04 # +1
Ну речь об том что задача чисто для I/O. А там, как известно, оптимизировать надо другое.
3.14159265 28.03.2013 22:54 # 0
>что данные лежат в символьном виде в оперативе
Прикол в том, что если будем грести по 128 бит, aligned ясен пень, такие загрузки очень сильно ускорят процесс, чем брать и ложить по одному чару. Там по-моему немного скорость снижается, если брать не кратное 32.
А обычно его потом еще и расширяют на все 32 зуба бита. И даже замена ветвлений на cmovы не сильно поможет.
Это еще одна статья ускорения. Думаю с версией борманда ниже, молотить будет раз в 15-20 быстрее. Что, в целом, существенный рывок. И труЪ способ для сишника.
bormand 28.03.2013 23:01 # 0
Разве что какой-нибудь кривой сетевой протокол, в котором все текстом.
3.14159265 28.03.2013 23:08 # +2
Я видел такую конвертацию говношифрованного бинарника в текстовый вид.
Ну кстати sse тогда еще бОльшую службу послужит.
Можно прямо там и дешифровать.
Да и в целом способ-то универсальный. Так еще задолго до sse паковали.
bormand 28.03.2013 23:12 # +2
3.14159265 29.03.2013 14:55 # +1
Да всё то же. Буквы, цифры, сдвиги. Основная трудность равно и другие символы.
Ну и то что base64 невыровнен по 2^n.
bormand 29.03.2013 15:44 # 0
Ну это придется компенсировать бОльшим блоком - загружать по 16 символов и конвертить их в 12.
С равно можно поступить тупо - последний неполный блок обработать наивным методом.
Если между символов нет энтеров и прочего мусора - вроде сложностей больше и нет.
defecate-plusplus 29.03.2013 16:10 # +3
помню как наткнулся на дичайшую подставу в бусте для base64 - где то в недрах boost.archive, вроде, наш сотрудник наткнулся на енкод- и декод-итераторы, заюзал их и был несказанно рад
а потом я разгребал эту багу - итераторы в бусте клали хер на возможную неполноту блока и тупо недоделывали буфер до конца
3.14159265 01.04.2013 15:00 # 0
Оказалось что если начать делать, то нету ничего сложного.
Остальное битоёбство с выранвиваниями слишком очевидно чтоб его делать.
http://ideone.com/40Q0cH
defecate-plusplus 01.04.2013 15:19 # 0
если тут забайтоёбен перевод 6 битов -> 1 символ, то такая тема всяко проиграет табличной замене
смысл примерно в том, чтобы 3 байта пачкой забайтоёбить в 4 символа (или 12 в 16, если так будет круче), и взад, чтобы обогнать табличный мэтод
3.14159265 01.04.2013 15:22 # 0
Ну блин само собой. Я уж думал после стольких обсуждений всем будет очевидно как расширить мой пример на пачку.
Вот думаю на декодингом.
Причем если сам декодинг - Hurt me plenty, то проверка валидности - Nightmare.
defecate-plusplus 01.04.2013 15:30 # 0
такая вундервафля ничего не обгонит, к сожалению :(
3.14159265 01.04.2013 15:44 # 0
Да.
> на каждую часть натравить func
Расширить func. И натравить на все одновременно.
>потом собрать результат в 4-байтном целом
Он сам соберется.
3.14159265 02.04.2013 18:32 # 0
Сделал типа рабочий кодер base64 для 64-битных слов.
https://ideone.com/4XHkj6
Вот как, блядь, нужно кодить, вот, быстро. Раз-раз-раз! Давай, кодь. Base64!
defecate-plusplus 02.04.2013 20:16 # 0
https://ideone.com/lLR7MB
выдает не то
(должен "TWFuIGlz")
пример взят из педовикии /Base64
3.14159265 02.04.2013 21:02 # 0
Можно объединить его с expand (который сам по себе непоптимален), но мне влом.борманда проси у него лучше получается
https://ideone.com/cG5svp
defecate-plusplus 28.03.2013 23:15 # +1
3.14159265 29.03.2013 16:50 # +1
xml и json сочли это преимущество сомнительным.
Правда наборы Š A хер так просто попарсишь.
defecate-plusplus 29.03.2013 17:03 # 0
ну так в &#x...; влезет то только целочисленное значение
туда не упихнуть 100500 байт бинарных данных
а уж целочисленное значение проще видеть глазами, понятное дело
3.14159265 29.03.2013 17:27 # 0
defecate-plusplus 29.03.2013 17:36 # +3
причем получится-то хуже 2/1:
> provide a (hexa)decimal representation of the character's code point in ISO/IEC 10646
т.е. в среднем для распространенного двухбайтового значения получится около 6 байт результата
даже не просто бинарные данные - так только символы можно кодировать
3.14159265 29.03.2013 17:39 # +1
Ну да. Говно. Плюс один: легче сходу читать эти коды. Ну типично для xml - читаемость как у бинарного, размер и эффективность как у текстового.
> получится-то хуже 2/1
Так еще и невыровненое.
>около 6 байт результата
Как и в json: \uABCD.
defecate-plusplus 29.03.2013 17:45 # 0
ну тут то максимум 6
а в xml - максимум 8 - &#xXXXX;
хорошо, прикид был неверный - в xml в среднем будет 7
3.14159265 29.03.2013 18:06 # +2
Как и в json: \\uABCD
3.14159265 02.04.2013 16:28 # 0
Декодинг base64 и самая хардкорная часть: проверка валидности.
http://ideone.com/xkizU4
defecate-plusplus 02.04.2013 16:52 # 0
2F: / - 51 63
3.14159265 02.04.2013 21:04 # 0
Делается по аналогии с энкодом.
Кусок c extr.
bormand 28.03.2013 20:52 # +1
3.14159265 28.03.2013 20:56 # 0
https://ideone.com/L3Ktdg
bormand 28.03.2013 20:59 # +3
3.14159265 28.03.2013 21:00 # 0
А, всё понял.
>по идее даже короче получился:
7 комманд. Круто.
А у них получится без проверок, для одного символа примерно столько же.
Но с ветвлениями, лол.
bormand 28.03.2013 21:21 # +1
3.14159265 28.03.2013 21:24 # 0
bormand 28.03.2013 21:26 # 0
3.14159265 28.03.2013 21:31 # 0
А-а-а теперь я понял откуда лишняя комманда больше было.
>return hex & b1; //теор. это можно убрать.
Я чищу перед возвратом, а у тебя очистка совмещена с перемешиванием байтов.
bormand 28.03.2013 21:32 # 0
> -а-а теперь я понял почему у меня на одну комманду больше было.
Нет. Лишняя команда была в lowcase.
3.14159265 28.03.2013 21:36 # 0
У меня 9.
bormand 28.03.2013 21:37 # 0
bormand 28.03.2013 21:28 # +1
3.14159265 28.03.2013 21:33 # 0
Кстати этот вариает самый очевидный. И наверно надо & 0x0F0F0F0F делать.
Не путь джедаев-байтоебов надеятся на lea.
Крут-крут. Я совсем сегодня плохо соображаю.
bormand 28.03.2013 21:34 # 0
3.14159265 28.03.2013 21:38 # 0
Я писал и думал как бы туда проверки впилить, но там адски, у нас три случая
a-0x30
00x1 - hex, который можно | сделать в 0011
0000 - цифра
Остальное - должно быть нулём. То есть надо верхние байты превратить в большую маску
LispGovno 28.03.2013 21:41 # −1
Не подскажите ли чего он такого курит?
Очевидно толстых хвостатых манулов.
3.14159265 28.03.2013 21:43 # +2
Ты тут недавно? Сначала было байтоебство. А ну да, именно ты и начал форсить тут хацкиль.
LispGovno 28.03.2013 22:21 # −1
3.14159265 28.03.2013 22:25 # 0
bormand 28.03.2013 22:29 # 0
3.14159265 28.03.2013 22:33 # 0
А кому он нужен? Я его тоже не курю. (только на уровне написать очередной коммент про AssParallel)
Знание явы - на 50% знание шарпа.
>для души в них совершенно ничего нет.
В SQL там свои приколы, но надо идти вглубь: планы запросов, расположения индексов и таблиц, схемы блокировок.
И каждый сервер - целая наука.
Со своими заморочками и граблями.
3.14159265 28.03.2013 22:02 # 0
Не получается больше 8.
3.14159265 28.03.2013 23:06 # 0
anonimb84a2f6fd141 02.04.2013 18:22 # −1
guest8 13.05.2019 22:28 # −999
guest8 13.05.2019 22:28 # −999