苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 2991|回复: 3

[其他] 位移操作字符串或操作字节数组

[复制链接]
发表于 2013-9-9 17:46:15 | 显示全部楼层 |阅读模式
7E000200000138350685710489717E
7E
0002
0000
013835068571
0489
71
7E
正常截取字符串无非就是正则或者substring,像上面的数据就没法用正则,但是使用substring的效率太低了,偶见高人使用位移操作.百思不得其解...自己也都不停的度娘过..出来的都是乘除运算....无奈发帖求助大神..{:soso_e113:}
this.ResponseMessageSerialNo = (ushort) ((byte_1[0] << 8) + byte_1[1]);  //0002
this.ResponseMessageId = (ushort) ((byte_1[2] << 8) + byte_1[3]);//0000
this.ResponsePhoneSim = (ushort) ((byte_1[4] << 0x18) + byte_1[5]<<0x10)+(byte_1[6] << 0x8)+(byte_1[7])  

DWORD 类型 [00000000]就是8位整型
        4个byte类型
                 第1个byte右移0x18
                 第2个byte右移0x10
                 第3个byte右移0x8
                 第4个byte无操作
WORD [0000] 4位整型
        2个byte
                 第1个byte右移0x8
                 第2个byte无操作         
                 

{:soso_e142:} 如果能解决或者提供个学习的地方不胜感激哇.



1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2013-9-10 08:18:13 | 显示全部楼层
其实我没太理解你要怎么样截取,
7E000200000138350685710489717E
7E
0002
0000
013835068571
0489
71
7E
是不是所有的字符都是安这个规则进行截取的。
2位,4,4,12,4,2,2
这样的规则,还是 根据什么别的规则,楼主先说清楚这个,如果是安我上面说的直接使用正则就行了,
如下
  1. (\w{2})+(\w{4})+(\w{4})+(\w{12})+(\w{4})+(\w{2})+(\w{2})+
复制代码
结果如下
QQ截图20130910081732.jpg
就是这样


 楼主| 发表于 2013-9-10 11:53:08 | 显示全部楼层

byte 数组如下
1 0 0 38 1 54 19 80 112 71 0 227 0 0 0 0 55 48 51 50 49 68 77 56 48 48 50 32 0 0 0 0 0 0 0 0 0 0 0 0 0 51 53 48 55 48 52 55 0 0
16进制后如下
0100002601361350704700e3000000003730333231444d383030322000000000000000000000000000333530373034370000
程序如下
将字节数组放入流中,在流中读取0x10个字节
using (MemoryStream stream = new MemoryStream(dst))
                {
                    using (BinaryReader reader = new BinaryReader(stream))
                    {
                          this.method_2((byte_0[0] << 8) + byte_0[1]);//14128
this.method_6((ushort) ((byte_0[2] << 8) + byte_0[3]));//13106
this.method_8(byte_0[4].ToString("X2") + byte_0[5].ToString("X2") + byte_0[6].ToString("X2") + byte_0[7].ToString("X2") + byte_0[8].ToString("X2") + byte_0[9].ToString("X2"));//31444D383030
this.method_10((ushort) ((byte_0[10] << 8) + byte_0[11]));//12832
this.method_12((ushort) ((byte_0[12] << 8) + byte_0[13]));//0
this.method_14((ushort) ((byte_0[14] << 8) + byte_0[15]));//0
上述method都是在对属性赋值,这个不用管,//后为得到的值
reader.BaseStream.Seek(-4L, SeekOrigin.Current);  //接着提升读取的位置因该是舍去刚读取过的内容
上面获得的都是需要发回去的参数
}}

byte_0 为
0 0 0 0 55 48 51 50 49 68 77 56 48 48 50 32 0 0 0 0 0 0 0 0 0 0 0 0 0 51 53 48 55 48 52 55 0 0
接下来这里得到了需要的内容
                this.ProvinceId = (ushort) ((byte_0[0] << 8) + byte_0[1]);
                this.CityId = (ushort) ((byte_0[2] << 8) + byte_0[3]);
                this.ManufactureId = Encoding.ASCII.GetString(byte_0, 4, 5).TrimEnd(new char[1]);
                this.TerminalModelNo = Encoding.ASCII.GetString(byte_0, 9, 20).TrimEnd(new char[1]);
                byte[] destinationArray = new byte[7];
                Array.Copy(byte_0, 0x1d, destinationArray, 0, 7);
                this.TerminalId = destinationArray[0].ToString("X2") + destinationArray[1].ToString("X2") + destinationArray[2].ToString("X2") + destinationArray[3].ToString("X2") + destinationArray[4].ToString("X2") + destinationArray[5].ToString("X2");
                this.PlateColor = (GEnum0) byte_0[0x24];
                this.LicenseNo = Encoding.GetEncoding("GBK").GetString(byte_0, 0x25, byte_0.Length - 0x25).TrimEnd(new char[1]);

这样他就通过位移得到需要的内容,有点不理解下面位移的时候怎么运算出结果的.
站长说的规则的话就是
dword 占8个byte
word 4个byte
byte
不过按照站长的方法的确可以满足得到结果,现在就是比较好奇怎么通过位移来得到结果.
这个因为是反编译别人的程序,我也不好发上来,免得牵扯到法律问题,下午我写个简易的dom.
发表于 2013-9-10 11:56:06 | 显示全部楼层
哎,这东西用处不大,能用正则还是最好用正则解决,方案维护还简单。
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-12-28 11:03

© 2014-2021

快速回复 返回顶部 返回列表