如何把byte[] 里面的两个连续字节,转换成一个十六进制数
这个做的目的在于我想把socket 接受到的数据的某一部分提取出来.然后得到数据包的类型
如ICMP 的ping echo_reply头两个字节是 0X0000

解决方案 »

  1.   

    参考下面的方法:            int num = 2147483647;
                byte[] buf=BitConverter.GetBytes(num);
                for (int i = 0; i < buf.Length; i += 2)
                {
                    MessageBox.Show("0x" + Convert.ToString(BitConverter.ToInt16(buf, i), 16));
                }
      

  2.   

    ((ushort)buf[i]) << 8 + buf[i+1];
    或者
    ((ushort)buf[i+1]) << 8 + buf[i];
      

  3.   

    我想是我的问题可能表达得不清楚,现在我写了一个程序端,很简单,我只是它的输出会是YES,我应该怎么转换?
    也就是说??????????这一段我该怎么写?
    新手,对数据类型转换不是很熟悉!!            byte[] buf = new Byte[5] { 0x03, 0x0b, 0x00, 0x00, 0x00 };            Int16 temp = ??????????????????;            if(temp == 0x030b) 
                {
                    PingListBox.Items.Add("yes");
                }
                else
                {
                    PingListBox.Items.Add("no");
                }
      

  4.   


                  byte[] buf = new Byte[5] { 0x03,   0x0b,   0x00,   0x00,   0x00   };                         Int16   temp   =  BitConverter.ToInt16(buf,0); 
                            //ToInt16,衹會轉換兩個字節,所以不必擔心,另外,0是要轉換的起始索引,這裡指從0x03開始
                            if(temp   ==   0x030b)   
                            { 
                                    PingListBox.Items.Add("yes"); 
                            } 
                            else 
                            { 
                                    PingListBox.Items.Add("no"); 
                            } 
      

  5.   

    我已经自己解决了 谢谢大家的帮忙首先不可以用ToUInt16,因为这样得到的将会是0000 1101  0000 0011 即0x0b03而我期待的结果是0000 0011 0000 1101即0x030b这个是由于内存分配的格式决定的所以我单独取出两位用(byte)BitConverter.ToChar(buf, 0); (byte)BitConverter.ToChar(buf, 1);同时进行强制转换(肯定不会溢出的),这个就可以完整取得了!!!
      

  6.   

    boblaw  谢谢你的帮助
    但是很可惜 ToUInt16的方法的确没有办法得到正确的结果,你可以马上调试一下!!!
    brookmill 同时也要感谢你
    但是你的方法我不是太了解,所以没有办法放到我的算法中去,很有可能也是因为内存分配的高低8位是相反的原因我希望能有人有更加简洁的方法来实现当然,我知道使用unsafe来用指针的话会很有效率,但是我希望使用C#的方法!!!
      

  7.   

    如果是处理socket数据,建议你不要用Int16,最好换成无符号的UInt16
    我是做嵌入式的,所以是C的思路,确实如你所说,很有效率但不象C#的方法。    byte[]   buf   =   new   Byte[5]   {   0x03,   0x0b,   0x00,   0x00,   0x00   };     UInt16 temp = (UInt16)(((UInt16)buf[0] << 8) + buf[1]);     if(temp   ==   0x030b)   
        { 
            PingListBox.Items.Add("yes"); 
        } 
        else 
        { 
            PingListBox.Items.Add("no"); 
        } 或者更容易理解的写法
        UInt16 temp = (UInt16)(buf[0] * 0x100 + buf[1]);