最近在整理10来年游戏研发中沉淀下来的知识。很多知识都是因为爱好所以深入学习和实现。也许曾经精力旺盛毫无优先级可言。纯粹为了实现自己的一刹那的想法。现在回忆起来依然记得当初的收获的快感。那会还是端游时代。编程主流语言是C++。数据库使用MSSQL。
很多玩家数据都是存放二进制流的方式。每次读写都需要C++加载到内存通过调试模式逐个看内存数据。尤其想看玩家数据是否符合正常等因为是二进制流。无法直接查看带来极大的困难。痛点激发出程序员本能的一切为了懒得需求。能否直接使用数据库存储过程查看二进制流。通过数据库函数实现。
数据库也是一种强大的语言。所以二进制的存取完全可以数据库来完成。同时完全理解各种语言在二进制流中的关联。学习这些完全体现任何之间都是有关联可以相互转换的。
查看二进制的方法
--参数一:BUF;参数二:查看类型;参数三:开始位置;;参数四:查看字符占字节数;
--使用select dbo.Peims_LookBuf()
--查看类型:1表示短型,2表示整形,3表示字符串
CREATE FUNCTION Peims_LookBuf(@Buf VARBINARY(2560), @LookType INT, @nBegin INT, @nLen INT)
RETURNS VARCHAR(2560)
AS
BEGIN
DECLARE @BackStr VARCHAR(2560)
DECLARE @nHight INT
IF @LookType = 1
BEGIN
SET @nHight = CAST(SUBSTRING(@Buf, @nBegin+1,1)AS INT)
IF @nHight >127 --负数
BEGIN
SET @BackStr=CAST((
CAST(SUBSTRING(@Buf, @nBegin,1)AS INT)
+(CAST(SUBSTRING(@Buf, @nBegin+1,1)AS INT)-256)*POWER(2,8)
)AS VARCHAR)
END
ELSE
BEGIN
SET @BackStr=CAST((
CAST(SUBSTRING(@Buf, @nBegin,1)AS INT)
+CAST(SUBSTRING(@Buf, @nBegin+1,1)AS INT)*POWER(2,8)
)AS VARCHAR)
END
END
IF @LookType = 2
BEGIN
SET @nHight = CAST(SUBSTRING(@Buf, @nBegin+3,1)AS INT)
IF @nHight >127 --负数
BEGIN
SET @BackStr=CAST((
CAST(SUBSTRING(@Buf, @nBegin,1)AS INT)
+CAST(SUBSTRING(@Buf, @nBegin+1,1)AS INT)*POWER(2,8)
+CAST(SUBSTRING(@Buf, @nBegin+2,1)AS INT)*POWER(2,16)
+(CAST(SUBSTRING(@Buf, @nBegin+3,1)AS INT)-256)*POWER(2,24)
)AS VARCHAR)
END
ELSE
BEGIN
SET @BackStr=CAST((
CAST(SUBSTRING(@Buf, @nBegin,1)AS INT)
+CAST(SUBSTRING(@Buf, @nBegin+1,1)AS INT)*POWER(2,8)
+CAST(SUBSTRING(@Buf, @nBegin+2,1)AS INT)*POWER(2,16)
+CAST(SUBSTRING(@Buf, @nBegin+3,1)AS INT)*POWER(2,24)
)AS VARCHAR)
END
END
IF @LookType = 3
BEGIN
SET @BackStr=CAST(SUBSTRING(@Buf, @nBegin, @nLen)AS VARCHAR)
END
RETURN(@BackStr)
END
数据库生成二进制整形
CREATE FUNCTION Peims_ADDIntBuf(@nInt INT)
RETURNS VARBINARY(256)
AS
BEGIN
DECLARE @BackBuf VARBINARY(256)
SET @BackBuf=CAST(@nInt AS BINARY(4))
SET @BackBuf=SUBSTRING(@BackBuf,4,1)+SUBSTRING(@BackBuf,3,1)+SUBSTRING(@BackBuf,2,1)+SUBSTRING(@BackBuf,1,1)
RETURN(@BackBuf)
END
数据库生成二进制短型
CREATE FUNCTION Peims_ADDShortBuf(@nShort SMALLINT)
RETURNS VARBINARY(256)
AS
BEGIN
DECLARE @BackBuf VARBINARY(256)
SET @BackBuf=CAST(@nShort AS BINARY(2))
SET @BackBuf=SUBSTRING(@BackBuf,2,1)+SUBSTRING(@BackBuf,1,1)
RETURN(@BackBuf)
END
删除某位置开始某段的数据
CREATE FUNCTION Peims_DelBuf(@Buf VARBINARY(2560), @nBegin INT, @nLen INT)
RETURNS VARBINARY(2560)
AS
BEGIN
DECLARE @BackStr VARBINARY(2560)
SET @BackStr=SUBSTRING(@Buf,1,@nBegin-1)+SUBSTRING(@Buf,@nBegin+@nLen,datalength(@Buf)-@nBegin-@nLen+1)
RETURN(@BackStr)
END
修改某位置开始某段的数据
CREATE FUNCTION Peims_UpdateBuf(@Buf VARBINARY(2560), @vValue VARBINARY(256),@nBegin INT, @nLen INT)
RETURNS VARBINARY(2560)
AS
BEGIN
DECLARE @BackStr VARBINARY(2560)
SET @BackStr=SUBSTRING(@Buf,1,@nBegin-1)
SET @BackStr=@BackStr+@vValue
SET @BackStr=@BackStr+SUBSTRING(@Buf,@nBegin+@nLen,datalength(@Buf)-@nBegin-@nLen+1)
RETURN(@BackStr)
END
在某个位置插入内容
CREATE FUNCTION Peims_InsertBuf(@Buf VARBINARY(2560), @vValue VARBINARY(256),@nBegin INT)
RETURNS VARBINARY(2560)
AS
BEGIN
DECLARE @BackStr VARBINARY(2560)
SET @BackStr=SUBSTRING(@Buf,1,@nBegin-1)
SET @BackStr=@BackStr+@vValue
SET @BackStr=@BackStr+SUBSTRING(@Buf,@nBegin,datalength(@Buf)-@nBegin+1)
RETURN(@BackStr)
END
应用例子:类比推广。所以二进制的存取完全可以数据库来完成。学习这些完全体现任何之间都是有关联可以相互转换的。
DECLARE @BackBuf VARBINARY(2560)
SET @BackBuf=dbo.Peims_ADDIntBuf(2147483647)
SET @BackBuf= @BackBuf+CAST('pe 中国zhongguo' AS BINARY(330)) --字符串的直接生成二进制
SET @BackBuf= @BackBuf+dbo.Peims_ADDShortBuf(-23567)
SET @BackBuf= @BackBuf+dbo.Peims_ADDIntBuf(25698456)
SELECT datalength(@BackBuf)
SELECT dbo.Peims_LookBuf(@BackBuf,2,1,4),
dbo.Peims_LookBuf(@BackBuf,3,5,330),
dbo.Peims_LookBuf(@BackBuf,1,335,2),
dbo.Peims_LookBuf(@BackBuf,2,337,4)
--删除某块
SEt @BackBuf=dbo.Peims_DelBuf(@BackBuf,335,2)
SELECT dbo.Peims_LookBuf(@BackBuf,2,1,4),
dbo.Peims_LookBuf(@BackBuf,3,5,330),
--dbo.Peims_LookBuf(@BackBuf,1,5,2),
dbo.Peims_LookBuf(@BackBuf,2,335,4)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。