亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從 x pos 二進制文件中提取文本

從 x pos 二進制文件中提取文本

Go
qq_花開花謝_0 2022-07-18 15:48:53
我正在嘗試讀取二進制文件以從不同位置獲取字符串;讀取 {IP,login,pwd} 我的想法是找到第一個 ip 并在之后讀取數據,因為之間的長度是一樣的:Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F00000060  5F 00 00 00 00 11 E0 BB 5F 00 00 00 00 01 34 31  _.....à?_.....4000000070  2E 31 39 31 2E 39 37 2E 36 32 00 00 00 00 00 00  .091.17.02......00000080  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................00000090  00 00 73 75 70 70 6F 72 74 00 00 00 00 00 00 00  ..support.......000000A0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................000000B0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................000000C0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................000000D0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................000000E0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................000000F0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................00000100  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................00000110  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................00000120  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................00000130  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................00000140  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................00000150  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................00000160  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................00000170  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................我的圍棋代碼import (    "io"    "log"    "os")func main() {    file, err := os.Open("data")    if err != nil {        log.Fatal(err)    }    defer file.Close()    o2, err := file.Seek(110, io.SeekCurrent) <---- find first occurrence     byteSlice := make([]byte, 32)    bytesRead, err := file.Read(byteSlice)    if err != nil {        log.Fatal(err)    }        log.Printf("IP: %s\n", byteSlice)    }如何在找到 ip 后找到所有出現的 { ip, login, pwd },用我的代碼我只能找到第一個 (ip) 32 位。去
查看完整描述

2 回答

?
皈依舞

TA貢獻1851條經驗 獲得超3個贊

謝謝你的幫助,


我使用 file.Seek(x,0) 像這樣的代碼:


file, err := os.Open("data.bin")

check(err)

defer file.Close()


o1, err := file.Seek(110, 0)  <--- first position

check(err)

_ip := make([]byte, 15)

ipRead, err := file.Read(_ip)

clean_ip := strings.ReplaceAll(string(_ip[:]), " ", " ")


o2, err := file.Seek(21, io.SeekCurrent)

check(err)

_user := make([]byte, 15)

userRead, err := file.Read(_user)

clean_user := strings.ReplaceAll(string(_user[:]), " ", " ")


o3, err := file.Seek(532, 0)  <---- Second position

check(err)

_pwd := make([]byte, 20)

pwdRead, err := file.Read(_pwd)

clean_pwd := strings.ReplaceAll(string(_pwd[:]), " ", " ")

它的工作但不干凈


查看完整回答
反對 回復 2022-07-18
?
繁花如伊

TA貢獻2012條經驗 獲得超12個贊

一種方法是迭代文件。本質上,您可以重新實現該strings程序。它類似于使用bufio#Scanner.Scan,但您需要迭代空字節而不是換行符。您可以使用 bufio#Scanner.Split,Go 甚至提供了一些預制功能。


我采用了ScanLines并修改為使用空字節而不是換行符。此外,也 ScanLines返回空行,所以我添加了一個空文本檢查:


package main


import (

   "bufio"

   "strings"

)


func null(b []byte, eof bool) (int, []byte, error) {

   if eof { return 0, nil, nil }

   for n := range b {

      if b[n] == 0 {

         return n+1, b[:n], nil

      }

   }

   return len(b), b, nil

}


func main() {

   s := bufio.NewScanner(strings.NewReader("March\x00April\x00May\x00\x00June"))

   s.Split(null)

   for s.Scan() {

      if s.Text() != "" {

         println(s.Text())

      }

   }

}


查看完整回答
反對 回復 2022-07-18
  • 2 回答
  • 0 關注
  • 117 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號