温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何查看表中的二进制流

发布时间:2020-08-11 05:49:11 来源:ITPUB博客 阅读:147 作者:WolfHawk_ITPUB 栏目:软件技术

​ 最近在整理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)
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI