2009-05-29 52 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,我称之为中间值。让我知道确切的术语。