问题描述
各位C#高人~小弟才接触C#几天。由于公司一前辈离职了,我么留在的没有什么人会c#所以特来请教。那前辈写的代码我基本能看懂,但是有一点今天改了一个下午没整对。其实应该很简单。假如就一段10字节的数据,data[10]=0x11223344556677889900。需要做的就是对每一字节做累加:for(inti=0;i<10;i++){byteresult[i]+=data[i];}
然后得出的结果应该为0x02DF对吧?但是定义的result[]的类型是byte。那么我用什么方法才能够算出的0x02DF放在某个类型的变量里面然后和原来的data[]连在一起形成0x1122334455667788990002DF?我能够想到的是定义一个ushort变量,然后把data每一位的累加放在这个ushort变量里面,然后再用结果和0xFF00还有0x00FF做与预算。得到的高位的那个右移8bit。然后把两得到的结果再存成byte格式的变量,让在data[]后面。但是写完编译的时候就报错,说&不能用做byte,int,char变量之间的运算。所以请各位大侠多多指教!
解决方案
解决方案二:
你这个是什么东西啊,看你想要做的是签名部分,那不应该是byte[]数组吗?为什么会有那么长的16进制整数……
解决方案三:
引用1楼starfd的回复:
你这个是什么东西啊,看你想要做的是签名部分,那不应该是byte[]数组吗?为什么会有那么长的16进制整数……
错了错了应该是byte[]data=newbyte[10]={0x11,0x22,0x33...0x99,0x00}
解决方案四:
指定长度或者签名什么的都是索引在最前面的几个byte或者最后面的几个byte,当然具体几个就在约定了重新生成一个数组,然后就是Array.Copy特定位置的事情了
解决方案五:
引用3楼starfd的回复:
指定长度或者签名什么的都是索引在最前面的几个byte或者最后面的几个byte,当然具体几个就在约定了重新生成一个数组,然后就是Array.Copy特定位置的事情了
我知道用C的写法,也就是unsignedshortSum;unsignedshorti;Sum=0;for(i=0;i<Len;i++){Sum+=(unsignedshort)(data[i]);}
不知道C#能有没有比较简单的写法。
解决方案六:
intsum=data.Sum()
解决方案七:
引用5楼starfd的回复:
intsum=data.Sum()
实践证明,我需要做的是重新整理数组成新的格式,也就是ushort。每个元素的高的byte右移8bit存成另外一个byte[]temp=newbyte[data.Length*2]的tamp[],低位的保持并存到temp[]里面,最后累加作为sum值。sum定义为ushort,所以sum仍然要做移位和类型强制转换到byte。谢啦~我好想现在都不知道自己在说什么……
解决方案八:
数字和数组的互转,你是要这个吧?
解决方案九:
你做的是2字节的sum校验,而不是单字节的所以应该定义个short型的变量来存放累加结果,而不是用byte来存放最后再用移位操作吧short分解成2个byte就行了如果移位不会,用short/256,short%256也可以简单的得到高字节和低字节
解决方案十:
说&不能用做byte,int,char变量之间的运算怎么还有char?真不知道你的代码到底是怎么写的,最好放出完整的代码来如果提示你&操作不能用于byte,你可以把byte强制转为int再做与运算但是其实你根本不需要做与运算,直接做个移位运算就行了shorts=12345;byteb1=(byte)s;//获取低8位,高8位舍弃byteb2=(byte)(s>>8);//获取高8位,就是将short右移8位,将高位挪到低位来
解决方案十一:
两字节应该用short或ushortushortsum=data.Sum();byte[]buffer=BitConverter.GetBytes(sum);byte[]result=data.Contact(buffer).ToArray();
解决方案十二:
需要注意的是BitConverter转成数组时的字节存放顺序(小端或大端),是否与你的需求一致,你也可以向LS那样,自己移位+按位与操作来分别取高位和低位字节