首頁 > 後端開發 > Golang > 主體

如何在不犧牲安全性的情況下確定 Go 中的位元組序?

Barbara Streisand
發布: 2024-11-03 01:54:02
原創
610 人瀏覽過

How to Determine Endianness in Go without Sacrificing Safety?

Go 中決定位元組序的綜合解

為了決定機器的位元組序,可以考慮使用下列Go 程式碼:

<code class="go">var i int = 0x0100
ptr := unsafe.Pointer(&i)
if 0x01 == *(*byte)(ptr) {
    fmt.Println("Big Endian")
} else if 0x00 == *(*byte)(ptr) {
    fmt.Println("Little Endian")
} else {
    // ...
}</code>
登入後複製

但是,這種方法依賴不安全的套件,這可能會導致不可移植且可能不安全的程式碼。幸運的是,Go 的TensorFlow API 提供了一種替代解決方案,它也利用了不安全的套件,但以更穩健的方式:

<code class="go">var nativeEndian binary.ByteOrder

func init() {
    buf := [2]byte{}
    *(*uint16)(unsafe.Pointer(&buf[0])) = uint16(0xABCD)

    switch buf {
    case [2]byte{0xCD, 0xAB}:
        nativeEndian = binary.LittleEndian
    case [2]byte{0xAB, 0xCD}:
        nativeEndian = binary.BigEndian
    default:
        panic("Could not determine native endianness.")
    }
}</code>
登入後複製

此程式碼片段利用了uint16 可以儲存在2 中的事實-byte 緩衝區,位元組的順序取決於系統的位元組順序。透過檢查緩衝區中位元組的排列,程式碼確定係統的位元組序並相應地設定 nativeEndian 變數。

利用此方法提供了一種更可靠的方法來檢查 Go 中的字節序,同時仍然遵守所施加的限制通過不安全的包裹。

以上是如何在不犧牲安全性的情況下確定 Go 中的位元組序?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!