Comment convertir des 4 derniers octets dans un tableau à un nombre entier?
Si j'ai un Uint8Array
tableau en JavaScript, comment pourrais-je obtenir les quatre derniers octets puis convertir un int? À l'aide de C# je voudrais faire quelque chose comme ceci:
int count = BitConverter.ToInt32(array, array.Length - 4);
Est-il un inequivalent façon de le faire à l'aide de JavaScript?
Oui
ok, mais cela ne fonctionne que sous firefox
et de Chrome, Et Safari et Opera, et IE10, et Android....
Vieille question, je sais, mais que C# méthode retourne un entier signé. Beaucoup de réponses ici sont de retour unsigned entiers. Être conscient et prudent.
ok, mais cela ne fonctionne que sous firefox
et de Chrome, Et Safari et Opera, et IE10, et Android....
Vieille question, je sais, mais que C# méthode retourne un entier signé. Beaucoup de réponses ici sont de retour unsigned entiers. Être conscient et prudent.
OriginalL'auteur Joey Morani | 2013-02-19
Vous devez vous connecter pour publier un commentaire.
Accéder au sous-jacente
ArrayBuffer
et de créer un nouveauTypedArray
avec une tranche de ses octets:Si le
TypedArray
ne couvre pas la totalité de la mémoire tampon, vous devez être un peu plus délicat, mais pas beaucoup:Cela fonctionne dans les deux cas.
Si les octets que vous voulez tenir dans la limite d'alignement de votre sous-jacente de la mémoire tampon pour le type de données (par exemple, vous souhaitez que la valeur de 32 bits des octets 4 à 8 de la sous-jacentes de la mémoire tampon), vous pouvez éviter de copier les octets avec
slice()
et il suffit de fournir un byteoffset pour le constructeur de la vue, comme dans @Bergi de réponse.Ci-dessous est un très-légèrement-testé la fonction que doit obtenir la valeur scalaire de tout décalage que vous voulez. Elle permettra d'éviter la copie, si possible.
Que vous pouvez l'utiliser comme ceci:
u8
est un point de vue décalé sur son tampon, qui devra être traité spécial.OriginalL'auteur Francis Avila
Avez-vous un exemple? Je pense que ce serait-il le faire:
[255,255,255,255]
entraînera-1
l'aide de ce code pour une raison quelconque.Le résultat est
-1
parce que sa signature. Ajouter un Unsigned Décalage à Droite de l'Opérateur>>> 0
pour convertir le résultat à une valeur non signée (4294967295
).hmm, ça a du sens.
Cela suppose que le tableau d'octets est big-endian, correct? Si oui, pourquoi avez-vous donné le big-endian solution quand la plupart des processeurs sont little-endian?
OriginalL'auteur lmortenson
Un petit peu élégante, mais si vous pouvez le faire manuellement basé sur l'endianess.
Little endian:
Big endian:
Cela peut être étendu à d'autres données de longueurs
Edit: Merci à David pour souligner mes fautes de frappe
.length
pas.Length
Pourquoi aucun des autres réponses traitent de la distinction entre little-endian et big-endian? Ils m'ont troublé au début parce que j'avais besoin d'un little-endian solution, mais tout de leur apparaissent big-endian. (ce qui est bizarre, car la plupart des processeurs little-endian) de toute façon, merci pour la réponse.
OriginalL'auteur jerry
Il devrait être plus efficace, il suffit de créer un
Uint32Array
vue sur le même ArrayBuffer et de l'accès au nombre de 32 bits directement:new Uint32Array(buffer, 2, 1)
Merci pour l'astuce, en cas de non-4Byte-multiples de la mémoire tampon, il serait nécessaire de tranche. J'ai corrigé mon code maintenant (les travaux ci-dessus), j'ai oublié que j'avais besoin de soustraire 4 de la byteLength pour obtenir 32 bits :-/
OriginalL'auteur Bergi
Aujourd'hui, si vous pouvez vivre avec IE 11+ /Chrome 49+ /Firefox 50+, alors vous pouvez utiliser DataView pour faire de votre vie presque aussi facile que en C#:
Le tester ici: https://jsfiddle.net/3udtek18/1/
OriginalL'auteur yms
OriginalL'auteur cIph3r
C'est une honte, il n'y a pas de construire de façons de le faire.
J'avais besoin de lire les variables de tailles variables sur la base de Imortenson réponse que j'ai écrit cette petite fonction où
p
est en position de lecture ets
est le nombre d'octets à lire:OriginalL'auteur Paweł Audionysos