Я пытаюсь узнать больше о байтах / битах и применить их к сценариям реального мира. До сих пор я нашел, что эти темы имеют много общего с ними:
- хэширования
- сжатия
- криптография
- манипуляции с изображениями (фильтры и тому подобное)
- прямой бит тиддлинга
- буферы
Но категория "буферы" в значительной степени ограничена библиотекой методов для манипулирования / доступа к массивам битов. Манипулирование изображениями и сжатие / хеширование, кажется, имеют большое количество вещей, но мне интересно, какие другие основные категории вещей вы видите (т.е. какие основные библиотеки существуют там), где код является сверхнизкоуровневой битовой манипуляцией и выглядит как это :
var K = [
0x428A2F98, 0xD728AE22, 0x71374491, 0x23EF65CD,
0xB5C0FBCF, 0xEC4D3B2F, 0xE9B5DBA5, 0x8189DBBC,
0x3956C25B, 0xF348B538, 0x59F111F1, 0xB605D019,
0x923F82A4, 0xAF194F9B, 0xAB1C5ED5, 0xDA6D8118,
0xD807AA98, 0xA3030242, 0x12835B01, 0x45706FBE,
0x243185BE, 0x4EE4B28C, 0x550C7DC3, 0xD5FFB4E2,
0x72BE5D74, 0xF27B896F, 0x80DEB1FE, 0x3B1696B1,
0x9BDC06A7, 0x25C71235, 0xC19BF174, 0xCF692694,
...
]
...
for (i = this.start; index < length && i < 128; ++index) {
code = message.charCodeAt(index);
if (code < 0x80) {
blocks[i >> 2] |= code << SHIFT[i++ & 3];
} else if (code < 0x800) {
blocks[i >> 2] |= (0xc0 | (code >> 6)) << SHIFT[i++ & 3];
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
} else if (code < 0xd800 || code >= 0xe000) {
blocks[i >> 2] |= (0xe0 | (code >> 12)) << SHIFT[i++ & 3];
blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
} else {
code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
blocks[i >> 2] |= (0xf0 | (code >> 18)) << SHIFT[i++ & 3];
blocks[i >> 2] |= (0x80 | ((code >> 12) & 0x3f)) << SHIFT[i++ & 3];
blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
}
}
То есть код не обязательно должен выглядеть в точности , как это, но вещи, где есть много битовых операций и целых чисел, над которыми работают (или с плавающей запятой, если это так). Было бы неплохо знать некоторые основные библиотеки, например, "ffmpeg", но в противном случае было бы полезно просто знать категории, чтобы начать.