2012-07-05 128 views
1

可以说我有一个这样定义的字节数组:C#结合字节数组,并转换为16位整数

byte[] byteArray = { 0x08, 0x00 }; 

我需要的元素数组中结合起来,创造:

0x0800 

然后再转换为int:

2048 

事情是这样的:

private static int GetMessageType(byte[] byteArray) 
    { 
     if(byteArray.Length != 2) 
      throw new ArgumentOutOfRangeException("byteArray"); 

     throw new NotImplementedException(); 
    } 
+0

两个字节不会形成Int32 ...您希望在此处进行哪些转换规则? – 2012-07-05 22:29:54

+0

0到15位是Int16,16到31位是0。因此,0x0800将是:0000 0000 0000 0000 0000 1000 0000 0000 – aelstonjones 2012-07-05 22:42:37

回答

4

为什么不使用简单的按位运算符?例如

byte hiByte = byteArray[0]; // or as appropriate 
byte lowByte = byteArray[1]; 
short val = (short)((hiByte << 8) | lowByte); 

在这种情况下所述按比特的结果被处理为[签名]一个short(以下标题?),并可能导致负的值,但根据需要通过仅移除铸件可以被修改..

+0

谢谢,这就是我一直在寻找的。 – aelstonjones 2012-07-05 22:56:09

+1

有[完整示例](http://ideone.com/Cdvzw)。 – 2012-07-05 23:01:34

1

您应该使用BitConverter.ToInt16,但看起来您希望进行BigEndian转换。所以使用Jon Skeet的EndianBitConverterhttp://www.yoda.arachsys.com/csharp/miscutil/

+0

我在Jon Skeets .dll上使用了一个反编译器,它看起来像他的EndianBitConverter使用了pst建议的相同的按位运算。 – aelstonjones 2012-07-05 22:57:31

+0

@aelstonjones:是的,但当你再次看到它时,更明确一些。 – 2012-07-05 23:03:11