La conversion de tableau d'octets chaîne de caractères en javascript
Comment puis-je convertir un tableau d'octets en une chaîne de caractères?
J'ai trouvé ces fonctions que faire l'inverse:
function string2Bin(s) {
var b = new Array();
var last = s.length;
for (var i = 0; i < last; i++) {
var d = s.charCodeAt(i);
if (d < 128)
b[i] = dec2Bin(d);
else {
var c = s.charAt(i);
alert(c + ' is NOT an ASCII character');
b[i] = -1;
}
}
return b;
}
function dec2Bin(d) {
var b = '';
for (var i = 0; i < 8; i++) {
b = (d%2) + b;
d = Math.floor(d/2);
}
return b;
}
Mais comment puis-je obtenir les fonctions de travail dans l'autre sens?
Grâce.
Shao
- Voulez-vous convertir un tableau d'octets en une chaîne de caractères ou un tableau de bits en une chaîne de caractères?
- Voir aussi la bonne solution pour l'utf8 tableau: Uint8Array de chaîne de caractères en Javascript
Vous devez vous connecter pour publier un commentaire.
Vous devez analyser chaque octet de retour à nombre de, et utiliser cette valeur pour obtenir un caractère, quelque chose comme ceci:
Edit: Oui, votre
string2Bin
peut plus être rédigé peu de temps:Mais en regardant la documentation est lié, je pense que le
setBytesParameter
méthode s'attend à ce que la goutte tableau contient les nombres décimaux, pas un chaîne de bits, de sorte que vous pouvez écrire quelque chose comme ceci:String.fromCharCode.apply(String, array)
est dangereux pour les très longues chaînes dans Safari. Il y a un problème dans JavaScriptCore qui signifie que les fonctions ne peuvent pas prendre plus de 65536 arguments, ou Elle sera levée. Il bloque le navigateur sur les tableaux légèrement plus petite. Voir bugs.webkit.org/show_bug.cgi?id=80797bin2String([0xE2, 0x98, 0xB9])
result +=
par un char dans une boucle de tuer la performance?Simplement
apply
votre tableau d'octets àString.fromCharCode
. Par exempleString.fromCharCode.apply(null, [102, 111, 111])
égal à 'foo'.
Mise en garde: œuvres pour des tableaux plus courte que 65535.
MDN docs ici.
Essayer le nouveau Texte de l'Encodage de l'API:
JS:
Que string2Bin peut être écrit de la même plus succinctement, et sans boucles, de démarrer!
Je pense que ce serait plus efficace:
Cela devrait fonctionner:
Ou
Même si je suis un peu en retard, j'ai pensé qu'il serait intéressant pour les futurs utilisateurs de partager quelques one-liners implémentations que j'ai fait à l'aide d'ES6.
Une chose que je considère importantes en fonction de votre environnement ou/et de ce que vous allez faire avec les données est de conserver toute la valeur d'un octet. Par exemple,
(5).toString(2)
vous donnera101
, mais le binaire complet de conversion est en réalité00000101
, et c'est pourquoi vous pourriez avoir besoin pour créer unleftPad
mise en œuvre pour remplir la chaîne d'octets avec des zéros. Mais vous ne pouvez pas besoin, comme d'autres réponses démontré.Si vous exécutez l'extrait de code ci-dessous, vous pouvez voir le premier résultat de la conversion de la
abc
chaîne en un tableau d'octets et juste après la re-transformation de ce tableau à la chaîne correspondante.JS:
Chaîne de tableau d'octets:
"FooBar".split('').map(c => c.charCodeAt(0));
Tableau d'octets de la chaîne:
[102, 111, 111, 98, 97, 114].map(c => String.fromCharCode(c)).join('');
N'ai pas trouvé de solution qui fonctionne avec les caractères UTF-8.
String.fromCharCode
est bon jusqu'à ce que vous rencontrer 2 octets caractère.Par exemple Hüser viendra comme
[0x44,0x61,0x6e,0x69,0x65,0x6c,0x61,0x20,0x48,0xc3,0xbc,0x73,0x65,0x72]
Mais si vous allez à travers elle avec
String.fromCharCode
vous aurez Hüser comme chaque octet sera converti en char séparément.Solution
Actuellement, je suis en utilisant la solution suivante:
J'ai eu quelques décrypté tableaux d'octets avec les caractères de remplissage et d'autres trucs que je n'ai pas besoin, donc je l'ai fait (sans doute pas parfait, mais il fonctionne pour mon utilisation limitée)
Trop tard pour répondre, mais si votre entrée est en forme d'octets ASCII, alors vous pouvez essayer cette solution: