二进制数据包的解析一般是借助C#等语言,在通讯程序中解析后形成字段,再统一单笔或者批量(表类型参数)提交至数据库,在通讯程序中,存在BINARY到struct再到table的转换。
[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);
}
????(
??????@withDeviceID BIT = 0
????)
????(
????)
?
????????IF @withdeviceid = 1
????????????????SET @sized = 16
????????????????SET @size = 72 + @sized
????????????????SET @sized = 0
?
????????SET @c = DATALENGTH(@data) / @size;
?
??????????????????????????????????????????@size) binDATA
???????????????????????FROM sys_id
???????????????????????WHERE id < @c
?????????????????????)
????????????????????( rawdata ,
??????????????????????DeviceID ,
??????????????????????hardwareno ,
??????????????????????meter ,
??????????????????????run ,
??????????????????????WORK ,
??????????????????????dead ,
??????????????????????starttime ,
??????????????????????endtime ,
??????????????????????emvtype ,
??????????????????????emvno
????????????????????)
??????????????????????????????WHEN 0 THEN bindata
????????????????????????????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, 12 + @sized) WORK ,
????????????????????????????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
PRINT N‘构造EMV数据,转换为BIN,然后再转换回EMV数据‘
go
????????????????????????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 ,
??????????????dead ,
??????????????starttime ,
??????????????endtime
????????????)
????????????????????NEWID() ,
????????????????????recordtype ,
????????????????????emvno ,
????????????????????recordno ,
????????????????????meter ,
????????????????????run ,
????????????????????work ,
????????????????????dead ,
????????????????????starttime ,
????????????????????EndTime
?
?
?