2014-10-02 2 views
0

Мне представлены два 32-разрядных целых числа, которые имеют в них кодированную в ASCII-строку с фиксированной длиной 8 символов.Декодирование фиксированной строки из целых чисел в Javascript

Например, строка «HEYTHERE» разделена на «HEYT» и «ЗДЕСЬ», и каждый из них разбит на четыре байта, чтобы дать 0x48455954 и 0x48455245 или 1212504404 и 1212502597 соответственно.

Каков наиболее эффективный способ преобразования этих двух чисел обратно в строку в Javascript?

До сих пор у меня есть следующий, но мне интересно, если есть быстрее/менее неуклюжий способ:

let xx1 = [ 1212504404, 1212502597 ]; 
let xx1str = String.fromCharCode((xx1[0] >> 24) & 255) + 
    String.fromCharCode((xx1[0] >> 16) & 255) + 
    String.fromCharCode((xx1[0] >> 8) & 255) + 
    String.fromCharCode(xx1[0]  & 255) + 
    String.fromCharCode((xx1[1] >> 24) & 255) + 
    String.fromCharCode((xx1[1] >> 32) & 255) + 
    String.fromCharCode((xx1[1] >> 8) & 255) + 
    String.fromCharCode(xx1[1]  & 255); 

ответ

1

Я думаю, что вы можете иметь хэш-таблицу из двух символов или четырех символов.

hash2 = { '4040': 'AA', '4041': 'AB', 
 
     '4845':'HE', 
 
     '5954':'YT', 
 
     '4845':'HE', 
 
     '5245':'RE' 
 
     } 
 
function madDecode(num) { 
 
    return hash2[num.toString(16).substr(0, 4)] 
 
    + hash2[num.toString(16).substr(4, 4)] 
 

 
} 
 
out.innerHTML = madDecode(0x40404041) +', ' 
 
    + madDecode(1212504404) + madDecode(1212502597)
<span id=out></span>

Вы можете улучшить дальше, используя 4 символов хэш. И еще дальше использовать массив вместо объекта.

hash2 = [] 
 

 
function chCode(x) { 
 
    x = x.toString(16) 
 
    while (x.length < 2) x = '0' + x 
 
    return x 
 
} 
 

 
function makeHash() { 
 
    for (var i = 32; i < 128; i++) { 
 
    for (var j = 32; j < 128; j++) { 
 
     hash2[parseInt(chCode(i) + chCode(j), 16)] = String.fromCharCode(i, j) 
 
    } 
 
    } 
 
} 
 

 
function arrDecode(num) { 
 
    var na = (num & 0xffff0000) >> 16, 
 
    nb = num & 0xffff 
 
    return hash2[na] + hash2[nb] 
 
} 
 

 
makeHash() 
 
document.write(arrDecode(1212504404) + arrDecode(1212502597))

+0

Спасибо. Мне нравится подход к поиску, хотя, поскольку мой случай должен быть для любой общей строки, закодированной таким образом, кешированный поиск, вероятно, должен быть необоснованным большим. Честно говоря, я скорее надеялся, что кто-то покажет мне аккуратное средство, встроенное в язык, который позволит мне сделать это в меньшем количестве кода и, желательно, без всех сдвигов и «и это то, что мое усилие использует. –

+0

зачем вам это нужно? – exebook

+0

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

Смежные вопросы