在SQL中使用CLR提供基本函数对二进制数据进行解析与构造
二进制数据包的解析一般是借助C#等语言,在通讯程序中解析后形成字段,再统一单笔或者批量(表类型参数)提交至数据库,在通讯程序中,存在BINARY到struct再到table的转换。
现借助CLR提供基本的INT2HEX(小端)等函数,在SQL中直接解析数据包。
基本函数
- [Microsoft.SqlServer.Server.SqlFunction(Name = "Time2UTCBin")]
- public
static SqlBinary Time2UTCBin(DateTime time) - {
- return
new SqlBinary(BitConverter.GetBytes((uint)(MyTime.ConverDateTimeToJavaMilliSecond(time) / 1000))); - }
- [Microsoft.SqlServer.Server.SqlFunction(Name = "UTCBin2Time")]
- public
static SqlDateTime UTCBin2Time(byte[] data,int offset) - {
- return
new SqlDateTime(MyTime.ConverDateTimeFromJavaMilliSecond(BitConverter.ToUInt32(data, offset) * 1000L)); - }
- [Microsoft.SqlServer.Server.SqlFunction(Name = "getSum")]
- public
static SqlByte Sum(byte[] buffer, int startPos, int endPos) - {
- byte b = 0;
- for (int i = startPos; i <= endPos; i++)
- {
- b ^= buffer[i];
- }
- return b;
- }
- [Microsoft.SqlServer.Server.SqlFunction(Name = "updateSum")]
- public
static SqlBinary updateSum(byte[] buffer, int startPos, int endPos, int sumPos) - {
- byte b = 0;
- for (int i = startPos; i <= endPos; i++)
- {
- b ^= buffer[i];
- }
- buffer[sumPos] = b;
- return
new SqlBinary(buffer); - }
- [Microsoft.SqlServer.Server.SqlFunction(Name = "Int2Bin")]
- public
static SqlBinary Int2Bin(int number) - {
- return
new SqlBinary(BitConverter.GetBytes(number)); - }
- [Microsoft.SqlServer.Server.SqlFunction(Name = "Long2Bin")]
- public
static SqlBinary Long2Bin(long number) - {
- return
new SqlBinary(BitConverter.GetBytes(number)); - }
- [Microsoft.SqlServer.Server.SqlFunction(Name = "Bin2Int")]
- public
static SqlInt32 Bin2Int(byte[] data, int offset) - {
- return
new SqlInt32(BitConverter.ToInt32(data,offset)); - }
- [Microsoft.SqlServer.Server.SqlFunction(Name = "Bin2Long")]
- public
static SqlInt64 Bin2Long(byte[] data, int offset) - {
- return
new SqlInt64(BitConverter.ToInt64(data, offset)); - }
- [Microsoft.SqlServer.Server.SqlFunction(Name = "getByte")]
- public
static SqlByte getByte(byte[] data, int offset) - {
- return
new SqlByte(data[offset]); - }
- [Microsoft.SqlServer.Server.SqlFunction(Name = "getBytes")]
- public
static SqlBytes getBytes(byte[] data, int offset,int count) - {
- byte[] temp = new
byte[count]; - Array.Copy(data, offset, temp, 0, count);
- return
new SqlBytes(temp); - }
数据包的结构体(表类型)
SQL中借助CLR实现的转换函数
- (
- @offset INT = 1 ,
- @withDeviceID BIT = 0
- )
- (
- [DeviceID] UNIQUEIDENTIFIER ,
- Meter INT ,
- run INT ,
- dead INT ,
- StartTime DATETIME ,
- EndTime DATETIME
- )
- IF @withdeviceid = 1
- SET @sized = 16
- SET @sized = 0
- WITH sub
- @size) binDATA
- FROM sys_id
- WHERE id < @c
- )
- INSERT @emv
- ( rawdata ,
- DeviceID ,
- hardwareno ,
- meter ,
- run ,
- WORK ,
- dead ,
- starttime ,
- endtime ,
- emvtype ,
- emvno
- )
- END ,
- CASE @withDeviceID
- END ,
- dbo.Bin2Int(bindata, 0 + @sized) RecordNo ,
- dbo.Bin2Int(bindata, 4 + @sized) Meter ,
- dbo.Bin2Int(bindata, 8 + @sized) run ,
- dbo.Bin2Int(bindata, 16 + @sized) dead ,
- dbo.utcbin2time(bindata, 20 + @sized) StartTime ,
- dbo.utcbin2time(bindata, 24 + @sized) EndTime ,
- dbo.getByte(bindata, 61 + @sized) RecordType ,
- dbo.getByte(bindata, 62 + @sized) EMVNo
- FROM sub
- (
- @emv DeviceTranscationEMV READONLY ,
- @withDeviceID BIT = 0
- )
- SET @bin = 0x0
- IF @withDeviceID = 0
- + dbo.int2Bin(meter)
- + dbo.int2Bin(run)
- + dbo.int2Bin(dead)
- + dbo.time2utcbin(starttime)
- + dbo.time2utcbin(endtime)
- 0, 62, 63)
- FROM @emv
- + dbo.updatesum(dbo.int2Bin([HardwareNo])
- + dbo.time2utcbin(starttime)
- + dbo.time2utcbin(endtime)
- FROM @emv
- RETURN @bin
测试代码
- PRINT N'构造EMV数据,转换为BIN,然后再转换回EMV数据'
- go
- DECLARE @emv DeviceTranscationEMV
- WITH data
- 15 Meter ,
- 100 run ,
- 80 WORK ,
- 20 dead ,
- DATEADD(s, id, '2014-9-1 12:50:01') StartTime ,
- DATEADD(mi, id, '2014-9-1 13:23:11') EndTime ,
- 4 RecordType ,
- 0 EMVNo
- FROM dbo.Sys_ID
- WHERE id < 100
- )
- ( rawdata ,
- deviceid ,
- emvtype ,
- emvno ,
- hardwareno ,
- meter ,
- run ,
- work ,
- dead ,
- starttime ,
- endtime
- )
- SELECT 0x00 ,
- NEWID() ,
- recordtype ,
- emvno ,
- recordno ,
- meter ,
- run ,
- work ,
- dead ,
- starttime ,
- EndTime
- FROM data
- SELECT *
- FROM @emv
- PRINT @data
- SELECT *
执行结果:
资源:
在SQL中使用CLR提供基本函数对二进制数据进行解析与构造的更多相关文章
- sql中根据逗号分隔,查出多行数据
--sql中根据逗号分隔,查出多行数据 select a.DiscussID,b.LocationID from (select DiscussID,LocationID=c ...
- sql中的 where 、group by 和 having 用法解析
--sql中的 where .group by 和 having 用法解析 --如果要用到group by 一般用到的就是“每这个字” 例如说明现在有一个这样的表:每个部门有多少人 就要用到分组的技术 ...
- ORA-01406:提取的列值被截断 ; SQL Server :将截断字符串或二进制数据
oracle 数据库可以正常连接,表数据也可以正常读取, 但在程序中相同的位置,有时会报错,有时不会报错,有的电脑会报错,有的不会 报错内容为 ORA-01406:提取的列值被截断 查了网上提供的一些 ...
- 在SQL中直接把查询结果转换为JSON数据
下面这篇中,已经有准备一些数据: <MS SQL server对象类型type>https://www.cnblogs.com/insus/p/10903916.html 为前端服务,直接 ...
- SQL中 根据行号设置每行数据的排序数值
根据行号自动把当前行号插入到某列中 实现排序 update tempTable set DisplayOrder = right( CAST(rownum as NVARCHAR),5) from( ...
- sql中关闭自增,并插入数据
ET IDENTITY_INSERT 允许将显式值插入表的标识列中. 语法 SET IDENTITY_INSERT [ database.[ owner.] ] { table } { ON | OF ...
- sql 中如何查询某一列的数据在另一个表中有没有?
假设表table1,列a,表table2,列bselect a from table1where a not in(select b from table2)
- Sql 中的as是什么意思 + 无列名注入解析
相当于取别名 这里结合一下无列名注入的知识点: 这种方法在第十届SWPUCTF的web1——广告招租里考到了:
- SQL中采用Newtonsoft.Json处理json字符串
原文 SQL中采用Newtonsoft.Json处理json字符串 使用环境: SQL Server2005; VS2010; 关于SQL中部署CLR程序集的方法,网上一搜一大把,需要了解的自行查阅, ...
随机推荐
- child-selector解释
这个伪类选择器应该叫孩子选择器,意思是选择网页中所有父节点的第一个子节点,并且这第一个子字节点必须是指定标签元素 写法有 :first-child :last-child :nth-child(odd ...
- JS框架avalon简单例子 行编辑 添加 修改 删除 验证
为什么要写这个例子:做表单的时候,表单包含主子表,对于子表的编辑,使用的是easyui datagrid的行编辑功能,由于业务比较复杂,实现起来比较麻烦,代码写的也很多,因为插件的封装,无法操作原始的 ...
- Asp.Net WebForm和MVC同样优秀!
不是说MVC不好,而是WebForm并没有那么不堪,和Mvc同样优秀.对说WebForm缺点多的,表示不服,求指教,虽然本人有些见解可能比较浅薄. 看过很多文章和书籍,都会拿MVC模式和WebForm ...
- ASP.NET MVC 请求流程
一.应用程序启动 1.Application_Start方法,程序启动 2.RegisterRoutes方法,注册路由 3.System.Web.Mvc.RouteCollectionExtensio ...
- C#-INotifyPropertyChanged(解决数据绑定的界面刷新问题)
最近做项目用到DataGridView,用它绑定数据源后,如果数据源中的数据修改无法及时刷新到控件上,必须切换单元格的焦点才能导致刷新显示新数值,通过查官方文档,用INotifyPropertyCha ...
- MySQL函数不能创建的解决方法
MySQL函数不能创建,是一个很麻烦的问题,下面就为您提供了一个解决此问题的方法,如果您也遇到过类似的问题,不妨一看. http://database.51cto.com/art/201010/229 ...
- 【转】数据库无关的GO语言ORM - hood
项目地址:https://github.com/eaigner/hood 这是一个极具美感的ORM库. 特性 链式的api 事务支持 迁移和名字空间生成 模型变量 模型时间 数据库方言接口 没有含糊的 ...
- Python中的编码
http://liguangming.com/how-to-use-utf-8-with-python http://www.lijiejie.com/python-sys-setdefaultenc ...
- tp5页面输出时,搜索后跳转下一页的处理
tp5页面输出时,搜索功能在跳转下一页时,如果不做任何处理,会返回原有是第二页输出的数据.为了保证跳转下一页时输出的是搜索到的数据,做以下处理. (要根据自己的搜索字段进行适当修改) 页面js代码,给 ...
- 在腾讯云上面搭建WordPress博客网站
一.准备工作 我们使用腾讯云服务器来运行WordPress,腾讯云会给新用户七天的产品体验时间还有一些代金券,做为新手尝试成本是比较小的. 腾讯云长期举办 "云+校园" 活动,学生 ...