Comment convertir un type de données long 64 bits en un type de données 16 bits

Je voudrais savoir comment convertir 64 bit long type de données de 64 bit long en l’un des types de données de 16 bit . Cette fonctionnalité est requirejse dans l’ application Ethernet pour inclure l’ horodatage . Seuls 2 octets ( 16 bits ) sont disponibles pour inclure l’ horodatage . Mais la valeur de l’ Win API de Win API est de 64 bit long . Une conversion du type de données 64 bits en un type de données 16 bits est donc essentielle.

    Eh bien, vous ne pouvez pas insérer 64 bits d’information dans 16 bits de stockage sans perdre une partie de l’information.

    C’est donc à vous de décider comment quantifier ou tronquer l’horodatage. Supposons, par exemple, que vous obteniez l’horodatage avec une précision de nanosecondes, mais que vous n’ayez besoin de le stocker qu’à une précision de quelques secondes. Dans ce cas, vous divisez le nombre 64 bits par 1000000000 et vous vous retrouvez avec les secondes. Ensuite, il pourrait tenir dans 16 bits ou non (16 bits ne stockent que jusqu’à 65535 secondes).

    Si ce n’est pas le cas, l’horodatage sera envoyé périodiquement. Ce qui, encore une fois, pourrait poser problème dans votre cas ou pourrait ne pas l’être.

    Dans tous les cas, si vous avez besoin d’interfacer une bibliothèque existante qui nécessite des horodatages, déterminez ce dont elle a besoin dans cet horodatage (les horloges clignotent? Secondes? Années?). Ensuite, déterminez ce que les fonctions Windows que vous utilisez sont renvoyées. Convertissez ensuite l’unité de temps Windows en unité de temps utilisée par la bibliothèque.

    16 bits peuvent ou non suffire, en fonction de vos besoins en horodatage. Dans la plupart des cas, il est trop petit ou du moins gênant. Cela pourrait toutefois fonctionner, par exemple: dépassement du délai d’attente, mesure du temps d’aller-retour pour les paquets, mesure grossièrement des intervalles de temps (ce qui pourrait bien fonctionner pour afficher des informations de temps aux utilisateurs), etc.

    En revanche, il est probablement inutile de réorganiser les paquets. Si tel est le cas, je vous suggérerais de remplacer l’horodatage par un compteur de séquence. En fonction du nombre typique de paquets dans le stream, vous pouvez même couper quelques bits et les utiliser à d’autres fins, car les compteurs de séquence peuvent gérer plus facilement le retour à la ligne.

    Comme les autres l’ont dit, le premier problème consiste à décider de la bonne mise à l’échelle. Vous devez équilibrer votre résolution avec la scope maximale souhaitée. Une façon de réfléchir consiste à décider combien de secondes par bit vous souhaitez. Avec 1 seconde par bit, vous pouvez exprimer des valeurs comsockets entre 1 seconde et 65 536 secondes ou environ 1 000 minutes. 1 milliseconde par bit vous permet de passer de 0,001 seconde à 65,5 secondes

    Voici une façon de faire la conversion.

     #define seconds_per_bit .0001 <--YOUR VALUE HERE. #define bits_per_second (1/seconds_per_bit); int16 timestamp() { Int64 counts_per_second,counts; QueryPerformanceFrequency(&counts_per_sec); QueryPerformanceCounter(&counts); return (UInt16)(counts * bits_per_second / counts_per_second); } 

    Cela dépend entièrement de l’utilisation de l’horodatage. Vous parlez d’Ethernet, donc une utilisation évidente que je pourrais imaginer est de commander des paquets. Et dans ce cas, tout ce dont vous avez besoin est un compteur. Au lieu que votre horodatage dise “ce paquet a été envoyé le 14 mai à 14h35”, il peut simplement dire “ceci est le 4023ème paquet”.

    Si vous en avez besoin pour enregistrer l’heure réelle, il vous suffit de sélectionner les parties pertinentes. 16 bits vous donnent 65 536 valeurs à jouer. Voulez-vous que ceux-ci représentent des secondes? Ensuite, vos horodatages se termineront toutes les 18 heures.

    Ou ils peuvent être minutes. Ensuite, il faudra 45 jours avant qu’ils ne s’emballent. Ou jours, ou microsecondes, tout dépend de ce dont vous avez besoin.

    Mais la seule façon de convertir une valeur de 64 bits en une valeur de 16 bits consiste à supprimer 48 bits de données. Vous choisissez lesquels