Javascript Tableaux Typés et Endianness
Je suis en utilisant WebGL pour rendre un binaire codé fichier de maillage. Le fichier binaire est écrit en format big-endian (je peux le vérifier en ouvrant le fichier dans un éditeur hexadécimal, ou de visualiser le trafic réseau à l'aide de fiddler). Lorsque je tente de lire la réponse binaire à l'aide d'un Float32Array ou Int32Array, le binaire est interprété comme little-endian et de mes valeurs sont fausses:
//Interpret first 32bits in buffer as an int
var wrongValue = new Int32Array(binaryArrayBuffer)[0];
Je ne trouve pas de références à la valeur par défaut boutisme de tableaux typés dans http://www.khronos.org/registry/typedarray/specs/latest/ alors je me demandais quel est le problème? Dois-je supposer que toutes les données binaires doivent être little-endian lors de la lecture à l'aide de tableaux typés?
Pour contourner le problème, je peux utiliser un objet DataView (voir le lien précédent) et de l'appeler:
//Interpret first 32bits in buffer as an int
var correctValue = new DataView(binaryArrayBuffer).getInt32(0);
Le DataView des fonctions telles que "getInt32" lire big-endian valeurs par défaut.
(Note: j'ai testé avec Google Chrome 15 et Firefox 8 et ils se comportent de la même manière)
- Dans le cas où certains se poseraient la question, je pense que la réponse est qu'il faut que j'écrive mon fichier à l'aide de little-endian.
- Qui a appelé à éviter le problème au lieu de le combler.
Vous devez vous connecter pour publier un commentaire.
Le comportement actuel, un peu tristement, c'est que l'endianness, c'est que du matériel sous-jacent. Comme presque tous les ordinateurs de bureau sont x86, ce qui signifie little-endian. La plupart des BRAS de Systèmes d'exploitation little-endian mode (les processeurs ARM sont bi-endian et peut donc fonctionner en mode).
La raison pour laquelle c'est un peu triste, c'est le fait que cela signifie que presque personne ne va vérifier qu'un code fonctionne sur big-endian matériel, mal ce qu'elle fait, et le fait que l'ensemble de la plate-forme web a été conçu autour du code de travail de façon uniforme à travers les implémentations et les plates-formes, ce qui les sauts de.
DataView
est pour.Prises à partir d'ici http://www.khronos.org/registry/typedarray/specs/latest/ (quand celui-spec est pleinement mis en œuvre), vous pouvez utiliser:
Toutefois, si vous ne pouvez pas utiliser ceux de la méthode, car ils ne sont pas mis en œuvre, vous pouvez toujours vérifier le dossier de la magie de la valeur (presque tous les formats a une valeur magique) sur l'en-tête afin de voir si vous devez inverser en fonction de vos endiannes.
Aussi, vous pouvez enregistrer endiannes fichiers spécifiques sur votre serveur et de les utiliser en conséquence à la détection de l'hôte endiannes.
Pour info, vous pouvez utiliser la fonction javascript suivante pour déterminer le boutisme de la machine, après quoi vous pourrez passer un bon format de fichier pour le client (vous pouvez stocker des deux versions du fichier sur le serveur, big endian et little endian):
Dans votre cas, vous devrez probablement soit de recréer le fichier en little endian, ou courir à travers l'ensemble de la structure de données pour la rendre little-endian. À l'aide d'une torsion de la méthode ci-dessus, vous pouvez échanger les endianness à la volée (pas vraiment recommandé et n'a de sens que si l'ensemble de la structure est la même serrées types, en réalité, vous pouvez créer un talon de fonction que les swaps d'octets en tant que de besoin):
new
etreturn bytes;
à votre code. Ces ateliers ont permis de rendre le code à exécuter pour moi. Merci.Uint32ArrayBuffer
Uint16Array
pourrait avoir été utiliséWORD
, vous auriez désordre de la mémoire tampon. Parce que tu voudrais permuter tous les deux octets, au lieu de quatre octets de l'inversion de l'ordrecheckEndian
fonction. Endianess fonctionne sur des octets, de sorte que deux octets doit être suffisante pour déterminer si l'ordre est le même, non? D'où la question pourquoi utiliser 4 pour déterminer quand les 2 ont été utilisé?Les autres réponses semblent un peu vieillot pour moi, donc voici un lien vers le dernier spec:
http://www.khronos.org/registry/typedarray/specs/latest/#2.1
En particulier:
Donc, si vous voulez lire/écrire des données dans des Big Endian (Network Byte Order), voir:
http://www.khronos.org/registry/typedarray/specs/latest/#DATAVIEW
Moyen rapide de vérifier l'endianness
Comment cela fonctionne:
view[0] = 1
définit le tableau pour 32-bit de valeur 1;!
exploitant à la suite de la&
opération, tout en l'inversant de sorte qu'elle retourne vrai pour big endian.