none
讀取記憶體 字串 RRS feed

  • 問題

  • 請問如果要讀取記憶體長度不一定的話要如何用for next 一直讀取到空白停止

    例如下面是用ce找出來的字串

    但每次戰鬥怪物數量多少不一 字串長度也會變 長度可能為下面的好幾倍長

    x|0|0|???1?|186D3|29|297|2A3|2|16C|000005|0|0|5|262343|138BCC|2A|287|2FF|276|292|3000009|0|0|A234|18DA8|1|67|67|47|47|3000001|0|0| 

    例如如果讀取固定長度的話 Dim data(6) As Byte 

    不確定的話 只能設大於要的數量? 如 >>Dim data(1000) As Byte

    Dim data(?) As Byte

    如開始位置為&HC48279 一直讀取到空白停止

     ReadMemoryByte(hProcess, &HC48279, data, ? , 0) 'data
     Label1.Text = (System.Text.Encoding.Default.GetString(data).Split(Chr(0))(0))



    2014年11月16日 下午 02:24

解答

  • 找出一個每段資料可能的終端點。

    如果不行就用 stream 的作法來取吧。


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    2014年11月17日 上午 12:12
    版主
  • 如果固定在第 12 個 | 要分離. 用 string.indexof 應該就辦得到.

    類似這樣

     Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim source As String = "C|0|0|超級測試員|19F0D|0|1E|1EC|21C|119|119|6000005|0|0|5|小蝙蝠|18B78|0|1E|1B6|1CF|22A|22A|3000009|0|0|A|虎人|18A88|0|15|1A5|1A5|17D|17D|9000001|0|0|B|地獄看門犬|18AA6|0|15|1C1|1C1|1A0|1A0|6000001|0|0|C|地獄看門犬|18AA6|0|15|1FA|1FA|1B9|1B9|6000001|0|0|D|地獄看門犬|18AA6|0|15|1BD|1BD|187|187|6000001|0|0|E|地獄看門犬|18AA6|0|15|1CC|1CC|180|180|6000001|0|0|F|地獄看門犬|18AA6|0|15|1DE|1DE|1C4|1C4|6000001|0|0|11|地獄看門犬|18AA6|0|15|1F8|1F8|194|194|6000001|0|0|13|虎人|18A88|0|15|17B|17B|164|164|9000001|0|0|"
            While source.Length > 0
                Debug.WriteLine(GetData(source))
            End While
        End Sub
    
    
        Private Function GetData(ByRef value As String) As String
            Dim count As Int32 = 0
            Dim lastindex As Int32 = 0
            Dim testvalue = value.Count(Function(c)
                                            c = "|"
                                            Return True
                                        End Function)
            If testvalue > 11 Then
                For i As Int32 = 0 To 11
                    lastindex = value.IndexOf("|", lastindex + 1)
                Next
                Debug.WriteLine(lastindex)
                Dim result As String = value.Substring(0, lastindex + 1)
                value = value.Substring(lastindex)
                Return result
            Else
                value = String.Empty
                Return String.Empty
            End If
    
        End Function


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2014年11月17日 下午 04:15
    版主

所有回覆

  • 找出一個每段資料可能的終端點。

    如果不行就用 stream 的作法來取吧。


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    2014年11月17日 上午 12:12
    版主
  • 例下面從遊戲讀取出來的文字

    2|0|0|53525|19F0D|0|1E|1EC|21C|119|119|6000005|0|0|5|35333|18B78|0|

    1E|1B6|1CF|22A|22A|3000009|0|0|A|

    |18A88|0|15|1A5|1A5|17D|17D|9000001|0|0|B|2

    |18AA6|0|15|1C1|1C1|1A0|1A0|6000001|0|0|C|345345|18AA6|0|15|1FA|1FA|1B9|1B9|6000001|0|0|D|23

    |18AA6|0|15|1BD|1BD|187|187|6000001|0|0|E|45345

    |18AA6|0|15|1CC|1CC|180|180|6000001|0|0|F|454535

    |18AA6|0|15|1DE|1DE|1C4|1C4|6000001|0|0|11|345543

    |18AA6|0|15|1F8|1F8|194|194|6000001|0|0|13|345354|18A88|0|15|17B|17B|164|164|9000001|0|0|

    如何分成

    x|0|0|dddsfsd|19F0D|0|1E|1EC|21C|119|119|6000005|

    0|0|5|sdfsdf|18B78|0|1E|1B6|1CF|22A|22A|3000009|

    0|0|A|sdfdf|18A88|0|15|1A5|1A5|17D|17D|9000001|

    0|0|B|sdfsdf|18AA6|0|15|1C1|1C1|1A0|1A0|6000001|

    上面規律 每12 " | " 就切成一段

    還是在讀取記憶體時就可以分成一段一段?

    因為名字長度不一 每段長度就不一樣長 目前文串長度只能 每12個 "|" 分一段 

      Dim xo(2000) As Byte
            Dim add As Integer = &H583A14
            Dim ax As String

            ReadMemoryByte(hProcess, add, xo, 2000, 0)
            ax = (System.Text.Encoding.Default.GetString(xo).Split(Chr(0))(0))
            TextBox1.Text = ax

    剛在論壇看字串做切割 拿來試一下   

    我把上面字串丟到textbox1.text

            Dim MyString As String = TextBox1.Text
             Dim split As String() = MyString.Split(New [Char]() {"|"c, ";"c})

            For Each s As String In split
                If s.Trim() <> "" Then
                    TextBox2.Text += s.Trim()
                End If
            Next s

    結果變成 只有|不見 

    x00sdfsdf19F0D01E1EC21C1191196000005005sdfsdf18B7801E1B61CF22A22A300000900Asdf18A880151A51A517D17D900000100Bsdf18AA60151C11C11A01A0600000100Csdf18AA60151FA1FA1B91B9600000100Dsdf18AA60151BD1BD187187600000100Esdf18AA60151CC1CC180180600000100Fsdf18AA60151DE1DE1C41C460000010011sdf18AA60151F81F819419460000010013dsf18A8801517B17B164164900000100

    看了一下結果應該是有分段 只是 照上面TextBox2.Text += s.Trim() 原本分好的又加在一起吧

    有大大可以幫忙一下嗎 謝謝



    2014年11月17日 下午 01:31
  • 如果把程式加入換行

    For Each s As String In split
                If s.Trim() <> "" Then
                  TextBox2.Text += vbCrLf & s.Trim()
                End If
            Next s

    果然分成好多段

    突然想到combobox

    改成

    combobox1.items.clear()

    For Each s As String In split
                If s.Trim() <> "" Then
                    ComboBox1.Items.Add(s.Trim())
                End If
            Next s 

    這樣就有辦法拿裡面的資料來用了

    ^^

    2014年11月17日 下午 02:35
  • 如果固定在第 12 個 | 要分離. 用 string.indexof 應該就辦得到.

    類似這樣

     Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim source As String = "C|0|0|超級測試員|19F0D|0|1E|1EC|21C|119|119|6000005|0|0|5|小蝙蝠|18B78|0|1E|1B6|1CF|22A|22A|3000009|0|0|A|虎人|18A88|0|15|1A5|1A5|17D|17D|9000001|0|0|B|地獄看門犬|18AA6|0|15|1C1|1C1|1A0|1A0|6000001|0|0|C|地獄看門犬|18AA6|0|15|1FA|1FA|1B9|1B9|6000001|0|0|D|地獄看門犬|18AA6|0|15|1BD|1BD|187|187|6000001|0|0|E|地獄看門犬|18AA6|0|15|1CC|1CC|180|180|6000001|0|0|F|地獄看門犬|18AA6|0|15|1DE|1DE|1C4|1C4|6000001|0|0|11|地獄看門犬|18AA6|0|15|1F8|1F8|194|194|6000001|0|0|13|虎人|18A88|0|15|17B|17B|164|164|9000001|0|0|"
            While source.Length > 0
                Debug.WriteLine(GetData(source))
            End While
        End Sub
    
    
        Private Function GetData(ByRef value As String) As String
            Dim count As Int32 = 0
            Dim lastindex As Int32 = 0
            Dim testvalue = value.Count(Function(c)
                                            c = "|"
                                            Return True
                                        End Function)
            If testvalue > 11 Then
                For i As Int32 = 0 To 11
                    lastindex = value.IndexOf("|", lastindex + 1)
                Next
                Debug.WriteLine(lastindex)
                Dim result As String = value.Substring(0, lastindex + 1)
                value = value.Substring(lastindex)
                Return result
            Else
                value = String.Empty
                Return String.Empty
            End If
    
        End Function


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2014年11月17日 下午 04:15
    版主
  • 若是要做遊戲剋星之類,大部分記憶體內重要的不是那堆字串,而是 整數、浮點數

    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2014年11月18日 下午 01:25
  • 是要寫個簡單外掛

    目前已經寫好了 也可以正常掛網

    只是那段字串是那遊戲資料重點

    所有人物怪物位置 血量 魔量 名字 全都在裡面 

    現在要寫如何處理字串 直接顯示出來 

    雖然沒那些資料也可以用 

    只是覺得可以寫更完整

    2014年11月18日 下午 01:50
  • 你可以試試這樣 , 不是最好的做法... 但可以分成

    C|0|0|超級測試員|19F0D|0|1E|1EC|21C|119|119|6000005|

    0|0|5|小蝙蝠|18B78|0|1E|1B6|1CF|22A|22A|3000009|

    0|0|A|虎人|18A88|0|15|1A5|1A5|17D|17D|9000001|

    0|0|B|地獄看門犬|18AA6|0|15|1C1|1C1|1A0|1A0|6000001|

    Code:

    static void Main(string[] args)
            {
                string SourceString = "C|0|0|超級測試員|19F0D|0|1E|1EC|21C|119|119|6000005|0|0|5|小蝙蝠|18B78|0|1E|1B6|1CF|22A|22A|3000009|0|0|A|虎人|18A88|0|15|1A5|1A5|17D|17D|9000001|0|0|B|地獄看門犬|18AA6|0|15|1C1|1C1|1A0|1A0|6000001|0|0|C|地獄看門犬|18AA6|0|15|1FA|1FA|1B9|1B9|6000001|0|0|D|地獄看門犬|18AA6|0|15|1BD|1BD|187|187|6000001|0|0|E|地獄看門犬|18AA6|0|15|1CC|1CC|180|180|6000001|0|0|F|地獄看門犬|18AA6|0|15|1DE|1DE|1C4|1C4|6000001|0|0|11|地獄看門犬|18AA6|0|15|1F8|1F8|194|194|6000001|0|0|13|虎人|18A88|0|15|17B|17B|164|164|9000001|0|0|";

                
                 string ConverToBig5 =  Encoding.GetEncoding(950).GetString(Encoding.Convert(Encoding.Unicode,Encoding.GetEncoding(950),Encoding.Unicode.GetBytes(SourceString)));

                Byte[] bytes = Encoding.GetEncoding(950).GetBytes(ConverToBig5);
                
                int t = 0;
                
                for(int i = 0 ; i < bytes.Length;++i)
                {
                    if(Equals(bytes[i].ToString(),"124"))
                    {
                        t += bytes[i];
                        if(t == 1488)
                        {
                            bytes[i + 1] = 45;
                            t = 0;
                        }
                    }
                }
               
                string str2 = Encoding.GetEncoding(950).GetString(bytes);
                string[] answer = str2.Split('-');
                foreach (string s in answer)
                {
                    Console.WriteLine(s);
                }
            }

    2014年11月19日 下午 02:54