千家信息网

如何查看表中的二进制流

发表于:2024-10-25 作者:千家信息网编辑
千家信息网最后更新 2024年10月25日,​ 最近在整理10来年游戏研发中沉淀下来的知识。很多知识都是因为爱好所以深入学习和实现。也许曾经精力旺盛毫无优先级可言。纯粹为了实现自己的一刹那的想法。现在回忆起来依然记得当初的收获的快感。那会还是端
千家信息网最后更新 2024年10月25日如何查看表中的二进制流

​ 最近在整理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)ASBEGIN    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)ASBEGIN    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)ASBEGIN    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)ASBEGIN    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)ASBEGIN    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)ASBEGIN    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)
0