2013-08-30 15 views
0

我有一個256字符長的字符串我用作位域,我想用JavaScript縮小,因此我可以將它用作url中查詢字符串的一部分。我不確定最佳/最有效的方法是什麼。在查詢字符串中使用的位域

我想我想要類似於這個解決方案的東西,Create a large bitfield,但是我的位域只有1和0。

任何想法?

+0

你考慮過Base64編碼了嗎?在你發佈的鏈接中,他們使用的是base-36。 – Halcyon

+0

@FritsvanCampen這將使它更長,不會更短! – Barmar

+0

@Barmar不是他的輸入是位而不是字符。一個基本的64位字符表示6位。所以你會得到一個43個字符的字符串。 – Halcyon

回答

0

所以這就是我想出的。我的位域保存在一個數組中。如果我把數組分成16個小塊,我可以做到以下幾點。

var bitArray = [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; 

console.log('Original array', bitArray); 
// Logs "Original array [ 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ]" 

var stringToArray = function (str) { 
    var arr = []; 

    for (var i = 0; i < str.length; i++) { 
     arr.push(parseInt(str[i], 10)); 
    } 

    return arr; 
}; 

var addPadding = function (str, maxLength) { 

    for (var i = 0; i < maxLength - str.length; i++) { 
     str = '0' + str; 
    } 

    return str; 
}; 

var shrink = function (str) { 
    str = parseInt(str, 10); 
    str = str.toString(36); 
    return str; 
}; 

var expand = function (str) { 
    str = parseInt(str, 36) + ''; 
    return str; 
}; 

var qs = bitArray.join(''); 

qs = shrink(qs); 

console.log('Shrunk value', qs); 
// Logs "Shrunk value 3xsdgob0n" 

// 10 characters is the maximum length of base36 string when converted. 
qs = addPadding(qs, 10); 
qs = addPadding(expand(qs), bitArray.length); 

console.log('Re-expanded array', stringToArray(qs)); 
// Logs "Re-expanded array [ 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ]"