10
votes

Comment puis-je combiner 4 octets dans un entier de 32 bits non signé?

J'essaie de convertir 4 octets en un entier non signé 32 bits.

Je pensais peut-être quelque chose comme: xxx

mais cela ne semble pas être travail. Qu'est-ce que je manque?


0 commentaires

3 Réponses :


8
votes

Utiliser le classe de bitconverter .

Spécifiquement, Cette surcharge.


3 commentaires

Et .. la raison pour laquelle vous utiliseriez ceci sur les changements manuels est parce que si mon code C # devait être compilé sur une architecture avec une autre endianesse qu'elle ne fonctionnerait toujours?


@PockI: Non, le changement de bit fonctionnera toujours de la même manière, peu importe la commande des octets réels eux-mêmes sont stockés en mémoire. <<< / Code> Toujours déplace les bits "plus haut" et >> les transfère "inférieur".


@PockI: Oui, La conversion est spécifique à l'endian. Il existe un drapeau spécifique au système que la classe utilise pour ajuster la conversion. Le code concerné ressemble à ceci: if (islittwittittittittittittleendian) {return ((((numref [0] | (numref [1] << 8)) | (Numref [2] << 0x10)) | (NumRef [3 ] << 0x18)); } retour (((((Numref [0] << 0x18) | (Numref [1] << 0x10)) | (Numref [2] << 8)) | Numref [3]);



11
votes

Vos changements sont tous éteints par 8. Décalage par 24, 16, 8 et 0.


13 commentaires

En supposant que vous choisissiez de coller avec les mathématiques plutôt que de déléguer, oui.


@Ignacio, la partie déroutante pour moi est que je transfère un octet plus de positions que ce qu'il n'a. Alors, pourquoi changer de position d'un octet 24 fonctionne-t-il? Il n'est pas coulé au 32bit Int qu'après tous les quarts de travail.


La valeur de l'octet occupe des morceaux 1 à 8. Vous souhaitez modifier 24 bits de sorte qu'il occupe des bits 24 à 32. Si vous déconnectez si 32 bits, il s'éteint dans l'oubli.


Le compilateur en est conscient de cela. Mais cela effectue toujours l'opération en 32 bits, quelle que soit la taille de l'opérande gauche.


@Ignacio, puis-je lire sur ce comportement du compilateur d'utiliser 32 bits pour ces opérations, même si le type utilisé est inférieur à cela? Je veux juste avoir une idée de ça.


@PockI: Tout est aligné sur la zéroth (plus à droite, le moins significatif). Chaque octet prend huit bits, afin d'obtenir le bit le plus significatif dans l'octet le plus important de la position la plus importante (la plus significative) dans le mot 32 bits, vous devez la modifier par 24 bits. L'octet le moins important n'a pas à être déplacé du tout. Écrivez une illustration simple sur un morceau de papier afin que vous puissiez la visualiser.


@Pocki: Je n'ai pas de référence pour cela moi-même, mais je sais que les compilateurs C fonctionnent de cette manière et je peux voir comment les concepteurs de C # voudront que ce comportement semblait familier aux développeurs.


@Rober Harvey, je comprends cette partie. Ce que je ne comprends pas bien, c'est comment vous pouvez même déplacer un ~ bit ~ 24 bits. Un octet détient 8 bits, alors le transforme de 24 positions serait trop. Il n'est pas converti au 32 bit UINT jusqu'à la suite des décalages. Alors, comment est-il capable d'effectuer les changements plus grands que les octets? Ignacio affirme que les changements sont effectués avec 32 bits disponibles. Comment?


@ROBERT: Qu'est-ce qu'il ne reçoit pas, c'est que depuis map [n] est de seulement 8 bits, pourquoi un changement de vitesse supérieur à 8 ne le refuse pas complètement.


@Pocki: Les opérateurs changeants fonctionnent automatiquement sur int S au minimum, ils mettent donc un octet ou un court dans un int puis faites le quart de travail. Si la valeur est déjà un long , il ne diminue pas la taille.


@Pocki: Joel est correct. Tous les octets sont lancés à une valeur entière 32 bits avant que le changement de vitesse soit effectué.


Merci à tout le monde d'avoir expliqué cela! C'était la déconnexion qui n'avait pas eu de sens pour moi.


Je viens de remarquer que le changement d'un Ushort convertit également sur int plutôt que uint . LONG L = (UINT) 255 << 24 et LONG L = 255 << 24 ont des résultats très différents.



6
votes

bitconverter.toint32 ()

Vous pouvez toujours faire quelque chose comme ceci: xxx

mais cela réinventerait la roue, car c'est en fait comment bitconverter.toint32 () est implémenté .


0 commentaires