2010-09-28 4 views
9

J'ai besoin de convertir des octets dans le format complément à deux en octets entiers positifs. La gamme de -128 à 127 mis en correspondance avec 0 à 255.Conversion de complément à deux

Examples: -128 (10000000) -> 0 , 127 (01111111) -> 255, etc. 

EDIT Pour dissiper la confusion, l'octet d'entrée est (bien entendu) un entier non signé dans la plage allant de 0 à 255. Mais il représente un entier signé compris entre -128 et 127 utilisant le format complémentaire à deux. Par exemple, la valeur d'octet d'entrée de 128 (binaire 10000000) représente réellement -128. Nous avons le flux d'octets suivant 0,255,254,1,127. En format complémentaire à deux, cela représente 0, -1, -2, 1, 127. J'ai besoin d'un serrage de 0 à 255. Pour plus d'informations consultez ce difficile de trouver l'article: Two's complement

+2

'byte' n'est pas signé, qu'est-ce que vous essayez de faire? – leppie

+0

Je ne suis toujours pas tout à fait sûr de ce qui est tenté ici. Soit c'est la façon dont toutes les réponses vous donnent, soit vous comprenez incorrectement la représentation du complément à 2. – leppie

Répondre

7

De vous entrez échantillon que vous voulez simplement:

sbyte something = -128; 

byte foo = (byte)(something + 128); 
+0

S'il vous plaît voir mes modifications. J'espère que c'est plus clair maintenant. – Yehonatan

+3

@Yehonatan: Mais comment voulez-vous représenter -1 dans la plage de 0 à 255? – leppie

0

Vous pourriez décrire quelque chose d'aussi simple que l'ajout d'un biais à votre numéro (dans ce cas, ajouter 128 au nombre signé).

+0

Si seulement c'était aussi simple que ça. – Yehonatan

6
new = old + 128; 

bingo :-)

+9

puisque je ne pouvais pas trouver le mot-clé 'bingo', j'ai édité votre réponse pour la lisibilité :-) – paxdiablo

+0

Est-ce que 'old' est la valeur originale de byte ou la conversion de celle-ci? Si c'est la valeur de l'octet original, cela donne la mauvaise réponse. Si c'est le dernier, alors c'est le processus que je demande. – Yehonatan

0

Si j'undestood correctement, le problème est de savoir comment convertir l'entrée, ce qui est vraiment un signed-byte (sbyte), mais cette entrée est stockée dans un unsigned integer, puis aussi évitez les valeurs négatives en les convertissant à zéro. Pour être clair, lorsque vous utilisez un type signé (comme ubyte), le framework utilise Two's complement derrière la scène, donc juste en utilisant le bon type, vous utiliserez le complément à deux.

Puis, une fois cette conversion effectuée, vous pouvez bloquer les valeurs négatives avec un if simple ou un opérateur ternaire conditionnel (?:).

Les fonctions présentées ci-dessous retourne 0 pour les valeurs from 128 to 255 (ou de -128 à -1), et pour les valeurs the same valuefrom 0 to 127.

Donc, si vous must utiliser des entiers non signés comme entrée et de sortie, vous pouvez utiliser quelque chose comme ceci:

private static uint ConvertSByteToByte(uint input) 
{ 
    sbyte properDataType = (sbyte)input; //128..255 will be taken as -128..-1 
    if (properDataType < 0) { return 0; } //when negative just return 0 
    if (input > 255) { return 0; } //just in case as uint can be greater than 255 
    return input; 
} 

Ou, à mon humble avis, vous pouvez changer votre entrée et les sorties aux types de données qui conviennent le mieux à votre entrée et de sortie (sbyte et octet):

private static byte ConvertSByteToByte(sbyte input) 
{ 
    return input < 0 ? (byte)0 : (byte)input; 
} 
2

Essayez

sbyte signed = (sbyte)input; 

ou

int signed = input | 0xFFFFFF00; 
1
public static byte MakeHexSigned(byte value) 
    { 
     if (value > 255/2) 
     { 
      value = -1 * (255 + 1) + value; 
     } 

     return value; 
    } 
1
int8_t indata; /* -128,-127,...-1,0,1,...127 */ 
uint8_t byte = indata^0x80; 

XOR MSB, qui est tout

+2

Cela ne ressemble pas à C# pour moi – reggaeguitar

0

Je crois que 2 s complémentaires octets serait préférable de faire avec ce qui suit. Peut-être pas élégant ou court mais clair et évident. Je voudrais le mettre comme une méthode statique dans l'une de mes classes util.

public static sbyte ConvertTo2Complement(byte b) 
{ 
    if(b < 128) 
    { 
     return Convert.ToSByte(b); 
    } 
    else 
    { 
     int x = Convert.ToInt32(b); 
     return Convert.ToSByte(x - 256); 
    } 
} 
1

Voici ma solution pour ce problème, pour les nombres supérieurs à 8 bits. Mon exemple est pour une valeur de 16 bits. Note: Vous devrez vérifier le premier bit, pour voir si c'est un négatif ou non.

Étapes:

  1. Convert # pour compléter en plaçant '~' avant variable. (Ie. Y = ~ y)

  2. Convertir #s à chaîne binaire

  3. chaînes binaires Pause dans un tableau de caractères

  4. A partir de droite plus de valeur, ajouter 1, garder une trace de porte. Stocker le résultat dans un tableau de caractères.

  5. Convertit le tableau de caractères en chaîne.

    private string TwosComplimentMath(string value1, string value2) 
    { 
        char[] binary1 = value1.ToCharArray(); 
        char[] binary2 = value2.ToCharArray(); 
        bool carry = false; 
        char[] calcResult = new char[16]; 
    
        for (int i = 15; i >= 0; i--) 
        { 
         if (binary1[i] == binary2[i]) 
         { 
          if (binary1[i] == '1') 
          { 
           if (carry) 
           { 
            calcResult[i] = '1'; 
            carry = true; 
           } 
           else 
           { 
            calcResult[i] = '0'; 
            carry = true; 
           } 
          } 
          else 
          { 
           if (carry) 
           { 
            calcResult[i] = '1'; 
            carry = false; 
           } 
           else 
           { 
            calcResult[i] = '0'; 
            carry = false; 
           } 
          } 
         } 
         else 
         { 
          if (carry) 
          { 
           calcResult[i] = '0'; 
           carry = true; 
          } 
          else 
          { 
           calcResult[i] = '1'; 
           carry = false; 
          } 
         } 
    
        } 
    
        string result = new string(calcResult); 
        return result; 
    
    } 
    
Questions connexes