第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

將一個(gè)簡(jiǎn)單的哈希函數(shù)從 c 轉(zhuǎn)換為 go

將一個(gè)簡(jiǎn)單的哈希函數(shù)從 c 轉(zhuǎn)換為 go

Go
慕森卡 2023-03-21 16:01:19
我正在嘗試將一個(gè)簡(jiǎn)單的哈希函數(shù)從 C 轉(zhuǎn)換為 Go。這些 C 和 Go 腳本之間有什么區(qū)別,我該如何修復(fù) Go 代碼?C -> 結(jié)果為 {FB;01;4C|64:KDY;KMT;KYR;KT0;TKK;PAC;UD01;UD02;UD03;ID01;ID02;ID03;SYS|124A}int   sum;char* pChar;char  s[8];msg = "{FB;01;4C|64:KDY;KMT;KYR;KT0;TKK;PAC;UD01;UD02;UD03;ID01;ID02;ID03;SYS|"sum = 0;pChar = msg + 1; // sum starts after the opening {while (*pChar != 0) {  sum += (int)*pChar++;}sprintf(s, "%04X}", sum);strcat(msg, s);轉(zhuǎn)到 -> 結(jié)果為 {FB;01;4C|64:KDY;KMT;KYR;KT0;TKK;PAC;UD01;UD02;UD03;ID01;ID02;ID03;SYS|004A}msg := "{FB;01;4C|64:KDY;KMT;KYR;KT0;TKK;PAC;UD01;UD02;UD03;ID01;ID02;ID03;SYS|"var sum uint8for i := 1; i < len(msg); i++ {    sum += msg[i]}s := fmt.Sprintf("%04X}", sum)req := strings.Join([]string{msg, s}, "")fmt.Println(req)
查看完整描述

2 回答

?
滄海一幻覺(jué)

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超5個(gè)贊

您需要將“var sum”設(shè)為“uint16”,否則它永遠(yuǎn)不會(huì)超過(guò) 00FF。



查看完整回答
反對(duì) 回復(fù) 2023-03-21
?
猛跑小豬

TA貢獻(xiàn)1858條經(jīng)驗(yàn) 獲得超8個(gè)贊

在您的 C 代碼中,的類(lèi)型sum是,它是大小為1int的至少 16 位的有符號(hào)整數(shù)類(lèi)型。

然而,你的 Go 代碼中的類(lèi)型sum是一個(gè)限制為 8 位的無(wú)符號(hào)整數(shù)類(lèi)型。uint8

根據(jù)您的 format string 判斷%04X},您可能需要一個(gè) 16 位值。

要修復(fù) Go 代碼,只需更改uint8int使用sum += int(msg[i])以使編譯器滿(mǎn)意。如果要sum嚴(yán)格保留 16 位的值,可以改用uint16and sum += uint16(msg[i])。

如果您想知道為什么需要包裝msg[i],uint16(...)那是因?yàn)槟獙⒅缔D(zhuǎn)換為不同的類(lèi)型。C 具有“整數(shù)提升”規(guī)則,可自動(dòng)將寬度小于的值轉(zhuǎn)換int為類(lèi)型的值int。然而,Go 沒(méi)有這樣的規(guī)則,只是拒絕編譯,聲明類(lèi)型不兼容。


順便說(shuō)一句,由于它的自動(dòng)內(nèi)存管理,你可以簡(jiǎn)單地在你的 Go 代碼中這樣做:

req := msg + fmt.Sprintf("%04X}", sum)
fmt.Println(req)

甚至:

s := fmt.Sprintf("%04X}", sum)
fmt.Println(msg + sum)

您當(dāng)前的方法沒(méi)有問(wèn)題;這只是額外的冗長(zhǎng)。


1 int要求在 C 中至少是 16 位,在 Go 中至少是 32 位,但現(xiàn)在這兩種語(yǔ)言通常都是 32 位。但是,您應(yīng)該知道,它在某些當(dāng)前系統(tǒng)上可能是 64 位的,并且在將來(lái)的某個(gè)時(shí)候?qū)τ谌魏我环N語(yǔ)言都可能默認(rèn)為 64 位;他們不需要保持?jǐn)?shù)據(jù)類(lèi)型大小同步。添加值時(shí)應(yīng)牢記這一點(diǎn),msg以確保 的值為sum16 位(或僅使用uint16)。


查看完整回答
反對(duì) 回復(fù) 2023-03-21
  • 2 回答
  • 0 關(guān)注
  • 150 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)