NodeJS, basE91, & little endian
Как бы я расшифровал приведенную ниже строку из basE91 в читаемый текст с помощью NodeJS?
8D7Hh-9D*.n-!DZrG-#DE-$DD-%DC-sl-tl-BEp2m-CE^Ul-DE}CH-EEE-FED-GEC-<l-=l-hE(.K-iEvqS-jEB-kEB-lEB-mEB-Rm-Sm-%E!{Q-&EDgN-(EG:K-)EE-*EE-+EB-xm-ym-GF{}U-HF()Q-IFt%D-JFE-KFB-LFD-[m-]m-mF;JG-nF7]Q-oF2-pFB-qFC-rFB-Wn-Xn-+FD-,FE-.FB- FE-:FD-;FC-2n-3n-
* РЕДАКТИРОВАТЬ *
Используя таблицу basE91, мне удалось преобразовать приведенную выше строку в шестнадцатеричную строку.
Шестнадцатеричная строка
5668557210457684246110336890114713568693668683768671151081161086669112501096769948510868691567726969697069687169676010861108104694046751056911811383106696610769661086966109696682109810937693312381386968103784069715875416969426969436966120109121109717012312585727040418173701637687470697570667670689110993109109705974711107055938111170501127066113706711470668711088104370684470694670664770695870685970675011051110
Затем я подал это в буфер
var buf = new Buffer(hex, 'hex');
console.log(buf.toString('utf8'));
Это дает мне:
VhUr►Ev?$a►3h?◄G‼V??f??v?q§►?▬►?f?↕P►?v?Hhi↕Vw&???♠??▬?va►?♦i@Fu►V?↑◄81♠if►v?if►??h! ?►??1#?8ih►7?♠?§?T▬??&??6?a ►?!►?↨☺#↕XW'♦♦↑↨7☺▬7htpiupfvph?►?1 ►?♣?G◄►p U??◄↨♣☺↕pf◄7♠q¶pf??►CphDpiFpfGpiXphYpgP◄♣◄►
Как я могу получить это в то, что я могу использовать? Я подозреваю, что это объект JSON...
4 ответа
У вас есть две совершенно разные проблемы, которые в ходе этой дискуссии схожи.
Как можно декодировать basE91, используя Javascript/NodeJS/CommnJS?
Это то, что ваш вопрос, кажется, с первого взгляда, и вы получили различные ответы в этом ключе. Похоже, ответ таков: решения не существует, но basE91 достаточно мал и прост, чтобы вы могли без проблем перенести его на JS.
Ваш второй менее ясный вопрос выглядит так:
Как я могу перепроектировать протокол связи игрового сервера Lord of Ultima?
Вы упомянули, что ваша строка "basE91 LE" пришла с игрового сервера MMO, и эта публикация на форуме о Lord of Ultima - это, пожалуй, единственный другой хит для "basE91 little endian". (Кроме того, похоже, что вы разместили там несколько дней назад.) Как отмечалось по-разному, данные, которые вы разместили, не совсем ванильный basE91. BasE91 имеет четко определенный набор используемых символов и-
' а также ''(пробел) нет среди них, но оба появляются в ваших данных. Вы упомянули в комментариях, что вы думали
-
'использовался в качестве разделителя, и было бы легче ответить на этот второй вопрос, если бы дополнительная информация была предоставлена заранее.
Некоторые заметки по этому вопросу:
BasE91 использует стандартную таблицу кодирования. Если вы создавали онлайн-игру и хотели немного запутать свой трафик, было бы тривиально использовать другую или зашифрованную таблицу. Это будет учитывать символы, которые не являются допустимыми basE91, появляющимися в ваших данных. Кроме того, в этом сообщении на этом форуме есть нечто похожее: другая таблица де / кодирования. Вы пытались использовать эту таблицу для декодирования части ваших данных вручную и посмотреть, имеет ли это смысл?
Вы запрашиваете преобразование в "читаемый текст", но basE91 используется для передачи двоичных данных, поэтому не ясно, почему можно использовать его для простого текста. Даже если предположить, что это кодирование текста, существуют различные распространенные способы кодирования простого текста, и декодированные данные, похоже, этого не делают. Скорее всего, данные представляют собой действительные двоичные данные, и в очень реальном смысле basE91 представляет собой текстовое представление. Без дополнительной информации о том, что вы ожидаете, трудно понять, как вы хотели, чтобы он был переведен в текст. Это кодировка basE91 для прозрачного GIF размером 1 пиксель:
JaQGWo*HBtAARDBtB"B"B"S|QtAAAA$M)Bc4v(#AsAAABtAACABtlBLHBtd
Это может быть преобразовано в читаемый текст? Вы упоминаете, что думаете, что это JSON, можете ли вы дать нам несколько советов, почему вы так думаете? (И снова, зачем использовать бинарный кодировщик для простого текста?)
Работая из того же сообщения на форуме, кажется, что вы работаете с серией 5-битных координат, так что, возможно, эти цифры - то, что вы ищете? Однако есть еще кое-что, потому что эти группы basE91 кодируют числа разных размеров. Остроумно (предупреждающая стена непостижимого текста):
echo '8D7Hh-9D*.n-!DZrG-#DE-$DD-%DC-sl-tl-BEp2m-CE^Ul-DE}CH-EEE-FED-GEC-<l-=l-hE(.K-iEvqS-jEB-kEB-lEB-mEB-Rm-Sm-%E!{Q-&EDgN-(EG:K-)EE-*EE-+EB-xm-ym-GF{}U-HF()Q-IFt%D-JFE-KFB-LFD-[m-]m-mF;JG-nF7]Q-oF2-pFB-qFC-rFB-Wn-Xn-+FD-,FE-.FB- FE-:FD-;FC-2n-3n-' \ | while IFS='' read -d - a; do echo -n "'$a' => "; echo -n "$a" \ | ./base91 -d | hexdump | head -1 | cut -d ' ' -f 2-; done # head and cut are easier that understanding hexdump's formatting system '8D7Hh' => 4d 01 57 84 '9D*.n' => 4e a1 3b 9f '!DZrG' => 4f 41 ec 19 '#DE' => 50 81 '$DD' => 51 61 '%DC' => 52 41 'sl' => 53 'tl' => 54 'BEp2m' => 6d 61 6b 9a 'CE^Ul' => 6e e1 ed 94 'DE}CH' => 6f c1 21 1c 'EEE' => 70 81 'FED' => 71 61 'GEC' => 72 41 '<l' => 73 '=l' => 74 'hE(.K' => 8d 61 3b 2b 'iEvqS' => 8e a1 e3 49 'jEB' => 8f 21 'kEB' => 90 21 'lEB' => 91 21 'mEB' => 92 21 'Rm' => 93 'Sm' => 94 '%E!{Q' => ad 01 da 43 '&EDgN' => ae 61 6c 35 '(EG:K' => af 81 4a 2b ')EE' => b0 81 '*EE' => b1 81 '+EB' => b2 21 'xm' => b3 'ym' => b4 'GF{}U' => cd c1 f3 53 'HF()Q' => ce e1 0d 43 'IFt%D' => cf 01 e9 0e 'JFE' => d0 81 'KFB' => d1 21 'LFD' => d2 61 '[m' => d3 ']m' => d4 'mF;JG' => ed c1 6f 18 'nF7]Q' => ee 21 ac 43 'oF2' => ef c1 'pFB' => f0 21 'qFC' => f1 41 'rFB' => f2 21 'Wn' => f3 'Xn' => f4 '+FD' => 0d 62 ',FE' => 0e 82 '.FB' => 0f 22 ' FE' => 71 ':FD' => 11 62 ';FC' => 12 42 '2n' => 13 '3n' => 14
Там, конечно, есть образец, и даже выглядишь немного порядочно, если правильно щуриться. Но они ничего не значат для меня, они выглядят разумно для вас?
Существует довольно компактная реализация Java basE91
кодер / декодер на github. Я думаю, это должно быть довольно легко перевести на JS.
Короткий ответ: нет простого / быстрого способа сделать это в node.js (и, по-видимому, в настоящее время также нет модулей).
Добавляя к комментарию @bryanmac, используя в качестве отправной точки base91 (основной исходный файл содержит всего 160 строк, включая информацию об авторских правах!), Вы можете хранить данные в буфере node.js, а после преобразования из base91 в байты использовать встроенные методы node.js для преобразования в строку.
Для "Как можно декодировать basE91, используя Javascript/NodeJS/CommnJS?"
Я перенес оригинальный basE91 в JavaScript, поддерживая String
, Buffer
а также Stream
в данный момент. Вы можете попробовать: https://github.com/Equim-chan/base91
Сначала нам нужен стол:
const table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&()*+,./:;<=>?@[]^_`{|}~"';
Основная часть encode
:
// `raw` is the input, asserted as `Buffer`
const len = raw.length;
let ret = '';
let n = 0;
let b = 0;
for (let i = 0; i < len; i++) {
b |= raw[i] << n;
n += 8;
if (n > 13) {
let v = b & 8191;
if (v > 88) {
b >>= 13;
n -= 13;
} else {
v = b & 16383;
b >>= 14;
n -= 14;
}
ret += table[v % 91] + table[v / 91 | 0];
}
}
if (n) {
ret += table[b % 91];
if (n > 7 || b > 90) ret += table[b / 91 | 0];
}
return ret; // basE91 encoded string
Основная часть decode
:
// `raw` is the input, asserted as `String`
const len = raw.length;
const ret = [];
let b = 0;
let n = 0;
let v = -1;
for (let i = 0; i < len; i++) {
const p = table.indexOf(raw[i]);
if (p === -1) continue;
if (v < 0) {
v = p;
} else {
v += p * 91;
b |= v << n;
n += (v & 8191) > 88 ? 13 : 14;
do {
ret.push(b & 0xff);
b >>= 8;
n -= 8;
} while (n > 7);
v = -1;
}
}
if (v > -1) {
ret.push((b | v << n) & 0xff);
}
return Buffer.from(ret); // basE91 decoded Buffer
Выше приведено стандартное кодирование / декодирование basE91, но, как упоминалось в @blahdiblah, очевидно, что вы получили нестандартную строку в кодировке basE91 с сервера (нет *
ни в стандартном столе).