日期:2014-05-17  浏览次数:20696 次

请教个C#char和int的转换问题
C++下这样的实现:char buf[4] ;从串口接收了四个字节,0x55,0xaa,0x55,0xbb,将这四个字节放入接收buf(char型)后,现在需要提取出来判断是否为帧头0x55aa55bb,即需要从char型数组里面提取四个字节转换为一个整形数据,在C++下 直接int temp =*(int*)buf即可,请问在C#下怎么实现?谢谢大家

还有比如我不是取开头的四个字节,而是中间某个字节开始的四个字节呢?
c# c++

------解决方案--------------------
 BitConverter .ToInt32 (new byte [],int startIndex);
------解决方案--------------------
引用:
引用:var ary = chararray.Skip(0).Take(4);谢谢!这里的var可以直接用int代替吗?

ary是个char数组

int sum = (int)chararray.Skip(0).Take(4).Select((t, index) => t * Math.Pow(2, 24 - index * 8)).Sum();

------解决方案--------------------
同意9楼的办法,但似乎有错,跟楼主要求的有点不一样,改成下面这样可满足楼主的需求


int sum=0;
int startIndex=0;
for(int i=0;i<4;i++)
{
  sum += ( ch[ startIndex+i ] * 256^((4-i) );//这步跟9楼不一样
}


这个是根据16进制的特性来的,比如帧头是0x55,0xaa,0x55,0xbb,想变成整形0x55aa55bb。
0x55aa55bb=0x55*256^3+0xaa*256^2+0x55*256+0xbb
就把一个字节看成是一个进制好了,那么就是256进制,规则参照十进制
------解决方案--------------------
c#是谁发明的?
我整理了下:
            string result=string.Empty;
            byte[] arr = { 1, 2, 3, 4, 5, 6, 7, 8 };

            //method 1;
            int intVal = 0;
            int startIndex = 1;
            for (int i = 0; i < 4; i++)
            {
                intVal += ( arr[startIndex + i] * (int)Math.Pow(256,i));
            }
            result += intVal.ToString() + "; ";

            //method 2;
            intVal = 0;
            intVal= BitConverter.ToInt32(arr, 1);
            result += intVal.ToString() + "; ";

            //method 3;
            intVal = 0;
            using (MemoryStream ms = new MemoryStream(arr))
            {
                ms.Seek(1, SeekOrigin.Begin);