溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何查看表中的二進(jìn)制流

發(fā)布時(shí)間:2020-08-11 05:49:11 來源:ITPUB博客 閱讀:141 作者:WolfHawk_ITPUB 欄目:軟件技術(shù)

? 最近在整理10來年游戲研發(fā)中沉淀下來的知識(shí)。很多知識(shí)都是因?yàn)閻酆盟陨钊雽W(xué)習(xí)和實(shí)現(xiàn)。也許曾經(jīng)精力旺盛毫無優(yōu)先級(jí)可言。純粹為了實(shí)現(xiàn)自己的一剎那的想法。現(xiàn)在回憶起來依然記得當(dāng)初的收獲的快感。那會(huì)還是端游時(shí)代。編程主流語言是C++。數(shù)據(jù)庫使用MSSQL。

? 很多玩家數(shù)據(jù)都是存放二進(jìn)制流的方式。每次讀寫都需要C++加載到內(nèi)存通過調(diào)試模式逐個(gè)看內(nèi)存數(shù)據(jù)。尤其想看玩家數(shù)據(jù)是否符合正常等因?yàn)槭嵌M(jìn)制流。無法直接查看帶來極大的困難。痛點(diǎn)激發(fā)出程序員本能的一切為了懶得需求。能否直接使用數(shù)據(jù)庫存儲(chǔ)過程查看二進(jìn)制流。通過數(shù)據(jù)庫函數(shù)實(shí)現(xiàn)。

? 數(shù)據(jù)庫也是一種強(qiáng)大的語言。所以二進(jìn)制的存取完全可以數(shù)據(jù)庫來完成。同時(shí)完全理解各種語言在二進(jìn)制流中的關(guān)聯(lián)。學(xué)習(xí)這些完全體現(xiàn)任何之間都是有關(guān)聯(lián)可以相互轉(zhuǎn)換的。

查看二進(jìn)制的方法

--參數(shù)一:BUF;參數(shù)二:查看類型;參數(shù)三:開始位置;;參數(shù)四:查看字符占字節(jié)數(shù);
--使用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 --負(fù)數(shù)
            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 --負(fù)數(shù)
            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

數(shù)據(jù)庫生成二進(jìn)制整形

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

數(shù)據(jù)庫生成二進(jìn)制短型

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

刪除某位置開始某段的數(shù)據(jù)

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

修改某位置開始某段的數(shù)據(jù)

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

在某個(gè)位置插入內(nèi)容

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

應(yīng)用例子:類比推廣。所以二進(jìn)制的存取完全可以數(shù)據(jù)庫來完成。學(xué)習(xí)這些完全體現(xiàn)任何之間都是有關(guān)聯(lián)可以相互轉(zhuǎn)換的。

DECLARE  @BackBuf VARBINARY(2560)
SET @BackBuf=dbo.Peims_ADDIntBuf(2147483647)
SET @BackBuf= @BackBuf+CAST('pe 中國zhongguo' AS BINARY(330))  --字符串的直接生成二進(jìn)制
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問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI