? 最近在整理10來(lái)年游戲研發(fā)中沉淀下來(lái)的知識(shí)。很多知識(shí)都是因?yàn)閻?ài)好所以深入學(xué)習(xí)和實(shí)現(xiàn)。也許曾經(jīng)精力旺盛毫無(wú)優(yōu)先級(jí)可言。純粹為了實(shí)現(xiàn)自己的一剎那的想法。現(xiàn)在回憶起來(lái)依然記得當(dāng)初的收獲的快感。那會(huì)還是端游時(shí)代。編程主流語(yǔ)言是C++。數(shù)據(jù)庫(kù)使用MSSQL。
創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比張家口網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式張家口網(wǎng)站制作公司更省心,省錢(qián),快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋張家口地區(qū)。費(fèi)用合理售后完善,十多年實(shí)體公司更值得信賴。
? 很多玩家數(shù)據(jù)都是存放二進(jìn)制流的方式。每次讀寫(xiě)都需要C++加載到內(nèi)存通過(guò)調(diào)試模式逐個(gè)看內(nèi)存數(shù)據(jù)。尤其想看玩家數(shù)據(jù)是否符合正常等因?yàn)槭嵌M(jìn)制流。無(wú)法直接查看帶來(lái)極大的困難。痛點(diǎn)激發(fā)出程序員本能的一切為了懶得需求。能否直接使用數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程查看二進(jìn)制流。通過(guò)數(shù)據(jù)庫(kù)函數(shù)實(shí)現(xiàn)。
? 數(shù)據(jù)庫(kù)也是一種強(qiáng)大的語(yǔ)言。所以二進(jìn)制的存取完全可以數(shù)據(jù)庫(kù)來(lái)完成。同時(shí)完全理解各種語(yǔ)言在二進(jìn)制流中的關(guān)聯(lián)。學(xué)習(xí)這些完全體現(xiàn)任何之間都是有關(guān)聯(lián)可以相互轉(zhuǎn)換的。
查看二進(jìn)制的方法
--參數(shù)一:BUF;參數(shù)二:查看類型;參數(shù)三:開(kāi)始位置;;參數(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ù)庫(kù)生成二進(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ù)庫(kù)生成二進(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
刪除某位置開(kāi)始某段的數(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
修改某位置開(kāi)始某段的數(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ù)庫(kù)來(lái)完成。學(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 中國(guó)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)