修改函数来读取float C# [英] modify function to read float C#

查看:163
本文介绍了修改函数来读取float C#的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  [DllImport(kernel32.dll)] 
public静态外部布尔ReadProcessMemory(IntPtr hProcess,int lpBaseAddress,字节[]缓冲区,int大小,int lpNumberOfBytesRead);


$ b public static int ReadAddress(string Process_Name,string Address_Offsets)
{
Process [] P; ((P = Process.GetProcessesByName(Process_Name))长度== 0)返回-1;
if
int Addy = -1;
while(Address_Offsets.Contains())
Address_Offsets = Address_Offsets.Replace(,);

int Index = -1; ((Index = Address_Offsets.IndexOf(0x,StringComparison.OrdinalIgnoreCase))!= -1)
Address_Offsets = Address_Offsets.Replace(Address_Offsets.Substring(Index,2),);

string [] tmp = Address_Offsets.Split('');
if(tmp [0] .Contains(+))
{
string [] AD = tmp [0] .Split('+');
foreach(P [0] .Modules中的ProcessModule M)
if(M.ModuleName.ToLower()== AD [0] .ToLower())
Addy = M.BaseAddress。 ToInt32()+ int.Parse(AD [1],NumberStyles.HexNumber);
}
else Addy = int.Parse(tmp [0],NumberStyles.HexNumber);

if(tmp.Length == 1)return Addy;
byte [] buff = new byte [4];
ReadProcessMemory(P [0] .Handle,Addy,buff,4,0);
Addy = BitConverter.ToInt32(buff,0);
for(int i = 1; i< tmp.Length; i ++)
{
int Off = int.Parse(tmp [i],NumberStyles.HexNumber);
ReadProcessMemory(P [0] .Handle,Addy + Off,buff,4,0);
Addy = i!=(tmp.Length - 1)? BitConverter.ToInt32(buff,0):Addy + = Off;
}
return Addy;

$ / code $ / pre

我是这样使用的:

  ReadAddress(solitaire,solitaire.exe + 97074 2c 10); 

这个函数适用于读取整数。但我想读花车。
有人告诉我,我必须做
$ b $ pre $ ReadmecessMemory(P [0] .Handle,Addy,buff, 4,0); //解除引用所有指针后,获得最终的期望值。
Addy = BitConverter.ToSingle(buff,0); // ToSingle将值转换为float。

但是我不明白在函数中把他的代码放在哪里。有人可以帮我吗?
thx提前:D。

解决方案

  int dataRead = ReadAddress solitaire,solitaire.exe + 97074 2c 10); 

给你(希望)在 int int 之后,你需要把它转换为float,这意味着 / p>

  byte [] bytesOfTheNumber = BitConverter.GetBytes(dataRead); 

首先将整数转换为一个字节数组,然后

  float theFloatYouWant = BitConverter.ToSingle(bytesOfTheNumber,0); 

使用该字节数组获取 float

I found this function on the internet:

[DllImport("kernel32.dll")]
public static extern bool ReadProcessMemory(IntPtr hProcess, int lpBaseAddress, byte[] buffer, int size, int lpNumberOfBytesRead);



    public static int ReadAddress(string Process_Name, string Address_Offsets)
    {
        Process[] P;
        if ((P = Process.GetProcessesByName(Process_Name)).Length == 0) return -1;
        int Addy = -1;
        while (Address_Offsets.Contains("  "))
            Address_Offsets = Address_Offsets.Replace("  ", " ");

        int Index = -1;
        while ((Index = Address_Offsets.IndexOf("0x", StringComparison.OrdinalIgnoreCase)) != -1)
            Address_Offsets = Address_Offsets.Replace(Address_Offsets.Substring(Index, 2), "");

        string[] tmp = Address_Offsets.Split(' ');
        if (tmp[0].Contains("+"))
        {
            string[] AD = tmp[0].Split('+');
            foreach (ProcessModule M in P[0].Modules)
                if (M.ModuleName.ToLower() == AD[0].ToLower())
                    Addy = M.BaseAddress.ToInt32() + int.Parse(AD[1], NumberStyles.HexNumber);
        }
        else Addy = int.Parse(tmp[0], NumberStyles.HexNumber);

        if (tmp.Length == 1) return Addy;
        byte[] buff = new byte[4];
        ReadProcessMemory(P[0].Handle, Addy, buff, 4, 0);
        Addy = BitConverter.ToInt32(buff, 0);
        for (int i = 1; i < tmp.Length; i++)
        {
            int Off = int.Parse(tmp[i], NumberStyles.HexNumber);
            ReadProcessMemory(P[0].Handle, Addy + Off, buff, 4, 0);
            Addy = i != (tmp.Length - 1) ? BitConverter.ToInt32(buff, 0) : Addy += Off;
        }
        return Addy;
    }

I is used like:

ReadAddress("solitaire", "solitaire.exe+97074 2c 10");

This function works good for reading integers. But I want to read floats. Someone told me, that I have to do

ReadProcessMemory(P[0].Handle, Addy, buff, 4, 0); // after you dereference all pointers and get the final "desired" value. 
Addy = BitConverter.ToSingle(buff, 0); // ToSingle converts value to float.

But I do not understand where to put his suggested code in the function. Can someone help me pls? thx in advance :D.

解决方案

int dataRead = ReadAddress("solitaire", "solitaire.exe+97074 2c 10");

Gives you (hopefully) 4 bytes in an int.

After you've read this int, you need to convert it to float, which means

byte[] bytesOfTheNumber = BitConverter.GetBytes(dataRead);

converting the integer number into a byte array first, and then

float theFloatYouWant = BitConverter.ToSingle(bytesOfTheNumber, 0);

using that byte array for getting a float.

这篇关于修改函数来读取float C#的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆