Qu'est-ce que la façon d'envoyer les valeurs de 64 bits sur JSON?
Certaines de mes données sont des entiers 64 bits. Je tiens à les envoyer à un programme JavaScript s'exécutant sur une page.
Cependant, autant que je peux dire, entiers, dans la plupart des implémentations de JavaScript sont de 32 bits signé quantités.
Mes deux options semblent être:
- Envoyer les valeurs comme des chaînes
- Envoyer des valeurs en virgule flottante de 64 bits des nombres
De l'Option (1) n'est pas parfait, mais l'option (2) semble beaucoup moins parfaite (perte de données).
Comment avez-vous géré cette situation?
Vous devez vous connecter pour publier un commentaire.
Cela semble être moins un problème avec JSON et de plus en plus un problème avec le Javascript lui-même. Qu'allez-vous faire avec ces chiffres? Si c'est juste une magie jeton que vous avez besoin de passer sur le site web plus tard, par tous les moyens, il suffit d'utiliser une chaîne de caractères contenant la valeur. Si vous avez réellement à faire de l'arithmétique sur la valeur, vous pourriez peut-être écrire vos propres routines de Javascript pour la version 64 bits de l'arithmétique.
D'une manière que vous pourriez représenter les valeurs en Javascript (et donc JSON) serait en divisant les nombres en deux valeurs de 32 bits, par exemple.
De diviser une valeur de 64 bits en deux valeurs de 32 bits, faire quelque chose comme ceci:
Puis de recombiner les deux valeurs de 32 bits vers une version 64 bits de valeur:
Il est en fait une limitation au JavaScript/ECMAScript niveau de précision de 53 bits pour les entiers (ils sont stockés dans la mantisse d'un "double" comme de 8 octets de la mémoire tampon). Ainsi la transmission des grands nombres sous forme de JSON ne sera pas la désérialisation comme prévu par le client de JavaScript, ce qui permettrait de les tronquer ses 53 bits de résolution.
Voir le
Nombre.MAX_SAFE_INTEGER
constante etNumber.isSafeInteger()
fonction:En raison de la résolution de flotteurs en JavaScript, en utilisant "64 bits des nombres à virgule flottante" comme vous l'avez proposé aurait à souffrir de la même restriction.
À mon humble avis, la meilleure option est de transmettre des valeurs telles que du texte. Il serait encore parfaitement lisible le contenu JSON, et il serait facile de faire un travail avec au JavaScript niveau.
Un "pur" chaîne de la représentation est ce OData indique, pour sa
Edm.Int64
ouEdm.Décimal
types.Ce que l'API Twitter dans ce cas, est d'ajouter un spécifique
".._str":
champ dans le JSON, en tant que tel:J'aime cette option beaucoup, puisqu'il serait toujours compatible avec int64 capable de clients. Dans la pratique, un tel contenu dupliqué dans le JSON n'aurez pas fait beaucoup de mal, si elle est dégonflé/format à l'adresse HTTP de niveau.
Une fois transmis en tant que chaîne de caractères, vous pouvez utiliser des bibliothèques comme strint – une bibliothèque JavaScript pour la chaîne codée entiers pour gérer de telles valeurs.
Javascript du type de Numéro (64 bits IEEE 754) ne dispose que d'environ 53 bits de précision.
Mais, si vous n'avez pas besoin de faire une addition ou la multiplication, alors vous pouvez garder la valeur 64 bits 4-les chaînes de caractères en JavaScript utilise UTF-16.
Par exemple, 1 peut être codé comme "\u0000\u0000\u0000\u0001". Ceci a l'avantage que la valeur de comparaison (==, >, <) travaille sur des chaînes comme prévu. Il semble aussi simple d'écrire les opérations sur les bits:
La JS numéro de représentation est une norme ieee double, de sorte que vous ne pouvez pas représenter un entier de 64 bits. si vous obtenez peut-être 48 bits réels de l'int de précision en double, mais tous les JS bitops réduire à 32 bits de précision (c'est ce que la spécification exige. yay!!!) donc, si vous avez vraiment besoin d'un 64 bits int en js, vous aurez besoin de mettre en place votre propre 64 bits int logique de la bibliothèque.
JSON lui-même ne se soucie pas de la mise en œuvre des limites.
votre problème, c'est que JS ne peut pas gérer vos données, pas le protocole.
En d'autres termes, votre JS code client à utiliser l'une de ces non-parfaite options.