2009-05-29 7 views
1

Comment formater le nombre qui peut être converti en octet [] (tableau);formation de nombre pour la conversion d'octets

Je sais comment convertir la valeur de résultat en byte [], mais le problème est de savoir comment formater le nombre intermédiaire.

C'est par des données,

int packet = 10; 
    int value = 20; 
    long data = 02; // This will take 3 bytes [Last 3 Bytes] 

i besoin de la valeur longue, grâce à ce que je peux changer et je vais remplir le tableau d'octets comme celui-ci

Byte[0] = 10; 
Byte[1] = 20; 
Byte[2] = 00; 
Byte[3] = 00; 
Byte[4] = 02; 

Byte 2,3,4 sont les données

mais le formatage de la valeur intermédiaire est le problème. Comment former ce

Voici l'exemple

données longues = 683990319104; /// J'ai appelé cela comme valeur intermédiaire.

Il s'agit du numéro que je reçois de l'application intégrée.

Byte[] by = new byte[5]; 

      for (int i = 0; i < 5; i++) 
      { 
       by[i] = (byte)(data & 0xFF); 

       data>>= 8; 
      } 


    Here 

Byte[0] = 00; 
Byte[1] = 00; //Byte 0,1,2 are Data (ie data = 0) 
Byte[2] = 00; 

Byte[3] = 65; //Byte 3 is value (ie Value = 65) 
Byte[4] = 159; // Byte 4 is packet (is Packet = 159); 

Ceci est un exemple.

BitConverter.GetBytes (..) est actuellement en cours de réception.

Octet lors de l'envoi, le paramètre est long.

donc je veux le format pour générer le nombre 683990319104 de

packet = 159 
value = 65 
data = 0 

Je pense que maintenant son format compréhensible :)

+0

Qu'est-ce que vous appelez "le nombre intermédiaire"/"valeur intermédiaire"? –

+0

Je ne connais pas le nom exact. J'ai appelé cette valeur 683990319104 comme valeur intermédiaire. – Mohanavel

Répondre

1

L'utilisation de 3 octets pour définir le long semble inhabituel; si c'est juste les 3 octets ... pourquoi un long? pourquoi pas un int?

Par exemple (notez que j'ai dû faire des suppositions sur votre octet de coupe en fonction de votre exemple - vous n'aurez pas la gamme complète int/long ...):

static void Main() { 
    int packet = 10; 
    int value = 20; 
    long data = 02; 

    byte[] buffer = new byte[5]; 
    WritePacket(buffer, 0, packet, value, data); 
    for (int i = 0; i < buffer.Length; i++) 
    { 
     Console.Write(buffer[i].ToString("x2")); 
    } 
    Console.WriteLine(); 
    ReadPacket(buffer, 0, out packet, out value, out data); 
    Console.WriteLine(packet); 
    Console.WriteLine(value); 
    Console.WriteLine(data); 
} 
static void WritePacket(byte[] buffer, int offset, int packet, 
    int value, long data) 
{ 
    // note I'm trimming as per the original question 
    buffer[offset++] = (byte)packet; 
    buffer[offset++] = (byte)value; 

    int tmp = (int)(data); // more efficient to work with int, and 
          // we're going to lose the MSB anyway... 
    buffer[offset++] = (byte)(tmp>>2); 
    buffer[offset++] = (byte)(tmp>>1); 
    buffer[offset] = (byte)(tmp); 
} 
static void ReadPacket(byte[] buffer, int offset, out int packet, 
    out int value, out long data) 
{ 
    // note I'm trimming as per the original question 
    packet = buffer[offset++]; 
    value = buffer[offset++]; 
    data = ((int)buffer[offset++] << 2) 
     | ((int)buffer[offset++] << 1) 
     | (int)buffer[offset]; 
} 
+0

J'ai suivi les méthodes similaires. – Mohanavel

2

Pas tout à fait sûr de ce que vous demandez exactement, mais je pense que vous êtes à la recherche pour BitConverter.GetBytes (données).

+0

BitConverter va: ne jamais rapporter 3 octets (pour int ou long), et b: ne pas être (nécessairement) big-endian. –

+0

+1 @Mohanavel; notez que le type long représente une valeur de 8 octets (et non 3), et que GetBytes renvoie 1, 0, 0, ... pour le nombre 1 et 0, 1, 0, ... pour 256, de sorte que son ordre à l'inverse par rapport à ce que vous semblez attendre dans votre tableau. –

+2

@Fredrik - la commande retournée par BitConverter dépend de votre CPU (x86/x64 vs IA64 etc) - et ne devrait donc pas vraiment être utilisée pour la transmission réseau à moins de connaître l'architecture du processeur. –

0

oooh,

Its simple 




    int packet = 159 
    int value = 65 
    int data = 0 


    long address = packet; 

    address = address<<8; 
    address = address|value; 
    address = address<<24; 
    address = address|data; 

maintenant la valeur d'adresse est 683990319104 et i appelé ce que la valeur intermédiaire. Faites-moi savoir le terme exact.

Questions connexes