2009-05-29 10 views
1

Byte [](配列)に変換できる数値をフォーマットする方法。バイト変換のための番号形成

私は結果の値をbyte []に​​変換する方法を知っていますが、問題は中間の数値をどのようにフォーマットするかです。

これは私がそれを通じて私がシフトすることができ、私は2,3,4バイトこの

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

のようなバイト配列を埋めるだろう、長い値を必要とするデータ、

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

でありますデータは

ですが、中間値の書式設定が問題です。ここでは、この

を形成する方法のサンプルは

長いデータ= 683990319104です。 ///これを中間値と呼んだ。

これは、内蔵アプリケーションから受信した番号です。

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); 

これは1つのサンプルです。

現在、BitConverter.GetBytes(..)は受信します。

バイト送信中は、パラメータが長いです。

は、だから私はフォーマットが

packet = 159 
value = 65 
data = 0 

から数683990319104を生成したい私はあなたが正確に求めているものを

+0

「中間値」/「中間値」とは何ですか? –

+0

正確な名前は分かりません。私はこの値を中間値として683990319104と名付けました。 – Mohanavel

答えて

1

longを定義するために3バイトを使用することは珍しいようです。それはちょうど3バイトです...なぜ長い?なぜintではない?例えば

(私はあなたのバイトトリミングあなたの例に基づいてについての仮定を作るために持っていた注意してください - あなたはフル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

私は同様の方法に従った。 – Mohanavel

2

全くわからない:)理解できる形式でその今だと思うが、私は、あなたが探していると思いますBitConverter.GetBytes(data)の場合

+0

BitConverterはa:3バイト(intまたはlongの場合)を報告しません。b:(必ず)ビッグエンディアンではありません。 –

+0

+1 @Mohanavel; long型は8バイトの値(3ではなく)を表し、GetBytesは1の場合は1,0,0、...、256の場合は0,1,0、...を返します。逆にあなたがあなたの配列で期待しているように見えるものに比べて。 –

+2

@Fredrik - BitConverterから返される注文は、CPU(x86/x64とIA64など)によって異なります.CPUのアーキテクチャを知らない限り、実際にネットワーク伝送に使用するべきではありません。 –

0

うーん、

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; 

ここで、アドレスの値は683990319104です。これを中間値と呼びます。正確な言葉を教えてください。

関連する問題