2009-05-29 53 views
1

如何格式化可以轉換爲Byte [](數組)的數字;字節轉換的編號

我知道如何將結果值轉換爲byte [],但問題是如何格式化中間數字。

這是由數據,

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

我需要的長值,通過,我可以移位和我要填補字節數組這樣

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

字節2,3,4-是數據

但格式化中間值是問題。如何形成本

下面是示例

長數據= 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); 

這是一個樣本。

目前BitConverter.GetBytes(..)是你得到的。

字節發送時,參數很長。

所以我想要的格式從

packet = 159 
value = 65 
data = 0 

產生數683990319104我現在認爲它在理解的格式:)

+0

你叫什麼「中間數字」/「中間值」? – 2009-05-29 08:05:34

+0

我不知道確切的名字。我稱這個值爲683990319104作爲中間值。 – Mohanavel 2009-05-29 08:59:54

回答

1

使用3個字節來定義long看起來很不尋常;如果它只是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]; 
} 
2

不能完全確定你是問究竟,但我認爲你正在尋找爲BitConverter.GetBytes(數據)。

+0

BitConverter將a:從不報告3個字節(對於int或long),並且b:不是(必然)是big-endian。 – 2009-05-29 08:04:36

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,我稱之爲中間值。讓我知道確切的術語。