Javascript ArrayBuffer Hex
J'ai un Javascript ArrayBuffer que je voudrais être converti en une chaîne hexadécimale.
Quelqu'un sait d'une fonction que je peux appeler ou d'un pré-écrites fonction déjà là?
J'ai seulement été en mesure de trouver arraybuffer aux fonctions de chaîne, mais je veux le convertir de la matrice de la mémoire tampon à la place.
- Que diriez -
number.toString(16)
Vous devez vous connecter pour publier un commentaire.
JS:
Cette fonction fonctionne en quatre étapes:
x
le tableau, il convertit qu'élément d'une chaîne hexadécimale (par exemple,12
devientc
).c
devient0c
).Ci-dessous est une autre plus longue de mise en œuvre qui est un peu plus facile à comprendre, mais en fait essentiellement la même chose:
JS:
let
etconst
états, qui sont en partie mais pas entièrement pris en charge dans Node.js 4 et 5 (ce qui conduit à un comportement incorrect). Il suffit de remplacer tous avecvar
consolidés au lieu de cela, ou la mise à niveau Node.js 6 ou 7, et il devrait fonctionner correctement.Array.prototype.map.call
appel dans le premier exemple est remplacé par unfor
boucle dans le second; ils sont fonctionnellement équivalents, bien que.x.toString(16)
est encore un caractèreIci est un doux ES6 solution, à l'aide de
padStart
et en évitant les assez déroutant de prototype-en fonction d'appel de la solution de la accepté de répondre. Il est effectivement plus rapide ainsi.Comment cela fonctionne:
Array
est créé à partir d'unUint8Array
la tenue de la mémoire tampon de données. Il en est ainsi, nous pouvons modifier le tableau pour stocker les valeurs de chaîne plus tard.Array
éléments sont mappés à leurs codes hex et rembourré avec0
caractères.[...new Uint8Array(buffer)]
pourrait être légèrement plus rapide (si d'autres tests sont une indication).Voici une autre solution qui est, sur Chrome (et probablement nœud trop) environ 3x plus rapide que les autres suggestions en utilisant
map
ettoString
:Bonus supplémentaire: vous pouvez facilement choisir les majuscules/minuscules sortie.
Voir banc ici: http://jsben.ch/Vjx2V
Voici plusieurs méthodes pour le codage d'un
ArrayBuffer
de l'hexagone, dans l'ordre de la vitesse. Toutes les méthodes ont été testées dans Firefox au début, mais après je suis allé et testé dans Chrome (V8). Dans google Chrome, les méthodes étaient pour la plupart dans le même ordre, mais il est léger differenences--la chose importante est que n ° 1 est la méthode la plus rapide dans tous les environnements par un énorme marge.Si vous voulez voir comment ralentir le actuellement sélectionné réponse est, vous pouvez aller de l'avant et faites défiler vers le bas de cette liste lmao.
Attention Copier-Dérouleurs
Être de bons garçons/filles et utiliser la solution #1. Il est à la fois la manière la plus rapide et la meilleure prise en charge. La seule méthode la plus rapide de l'encodage hexadécimal dans un navigateur est écrit optimisé le code C et de la compilation de Web de l'Assemblée.
1. Précalculées Hex Octets w/
for
Boucle (plus Rapide/de Base)Cette approche calcule les 2 caractères hex octets pour chaque valeur possible d'un octet non signé:
[0, 255]
, et puis il suffit de cartes de chaque valeur dans leArrayBuffer
à travers le tableau de chaînes octet. Crédit à Aaron Watters pour l'original réponse à l'aide de cette méthode.2. Précalculées Hex Octets w/
Array.map
(~30% plus lent)Même que la méthode ci-dessus, où nous précalculer un tableau dans lequel la valeur de chaque indice est la chaîne hexadécimale de l'indice de la valeur, mais nous utilisons un hack où nous en appelons à la
Array
du prototypemap()
méthode avec le tampon. C'est une approche plus fonctionnelle, mais si vous voulez vraiment vitesse, vous pourrez toujours utiliserfor
boucles plutôt que ES6 les méthodes de tableau, comme tous les JS moteurs optimiser beaucoup mieux.3. Précalculées des Codes de Caractères ASCII (~230% plus lent)
Eh bien, ce fut une expérience décevante. J'ai écrit cette fonction parce que je pensais que ça allait être encore plus rapide qu'Aaron précalculées hex octets--j'avais tort LOL. Tandis que Aaron cartes entier d'octets correspondant à 2 caractères hex codes, cette solution utilise bitshifting à obtenir la tête du personnage pour les 4 premiers bits de chaque octet et puis, l'un pour les 4 derniers et utilise
String.fromCharCode()
. Honnêtement, je penseString.fromCharCode()
doit tout simplement être mal optimisé, car il n'est pas utilisé par de très nombreuses personnes et est bas sur le navigateur internet des vendeurs de listes de priorités.4.
Array.prototype.map()
w/padStart()
(~290% plus lent)Cette méthode des cartes d'un tableau d'octets à l'aide de la
Number.toString()
méthode pour obtenir le hex et puis rembourrage de l'octet avec un "0" si nécessaire via leString.padStart()
méthode.5.
Array.from().map()
w/padStart()
(~370% plus lent)C'est le même que le n ° 4 mais au lieu de la
Array
prototype hack, nous avons créer un nombre réel tableau à partir de laUint8Array
et appelmap()
sur directement. Nous payons en vitesse si.6.
Array.prototype.map()
w/slice()
(~450% plus lent)C'est la réponse choisie, ne l'utilisez pas à moins que vous êtes typique d'un développeur web et les performances qui vous rend mal à l'aise (réponse #1 est prise en charge par la comme de nombreux navigateurs).
La solution suivante utilise précalculées tables de choix pour à la fois en avant et en arrière de conversion.
Cette solution est plus rapide que le vainqueur de la précédente référence:
http://jsben.ch/owCk5 testé dans Chrome et Firefox sur un ordinateur portable Mac. Voir aussi le code de référence pour un test de validation de fonction.
[edit: j'ai changer le forEach pour une boucle for et maintenant il est encore plus rapide.]
String.fromCharCodes()
au lieu dejoin
ing un tableau de chaînes de caractères. C'est de la pure spéculation et si j'ai besoin de tester.Je l'utilise pour convertir
ArrayBuffer
s de la même manière que le Nœud déchargesBuffer
s.Exemple (avec transpiled js version):