Что собой представляет способ представления чисел с плавающей запятой (float) с использованием 4 байтов и целых чисел (int)?

Вы, вероятно, недопоняли суть моего вопроса, так же как и я не до конца понимаю, что именно требуется. Позвольте мне пояснить: мне нужно использовать функцию ReadWriteMemory для записи значения в указанный адрес. Однако, насколько я понимаю, ReadWriteMemory не может корректно записать значение типа float. Вместо этого он записывает некое представление этого значения через 4 байта и тип int. Я могу продемонстрировать это с помощью изображения из Cheat Engine.
  • 4 ноября 2024 г. 4:22
Ответы на вопрос 2
Ваша задача заключается в записи значения с плавающей запятой (float) в память по указанному адресу с использованием функции `ReadWriteMemory`, которая, по всей видимости, работает только с целыми числами (int). 

Числа с плавающей запятой в формате `float` на большинстве современных архитектур (например, x86 и x64) обычно хранятся в 4 байтах (32 бита). Это означает, что значение типа `float` можно представить в виде последовательности из 4 байт. Эти байты могут быть просто записаны в память как целые числа.

Когда вы читаете или записываете числа с плавающей запятой, вы работаете с их двоичным представлением. Чтобы выполнить запись числа типа `float` в память, вам нужно:

1. Подготовить значение `float`.
2. Преобразовать его в массив байтов.
3. Записать эти байты по указанному адресу.

Пример преобразования значения `float` в его 4-байтовое представление и последующей записи в память в C# можно реализовать следующим образом:

```csharp
using System;
using System.Runtime.InteropServices;

public class MemoryEditor
{
    // Функция для записи в память
    [DllImport("kernel32.dll")]
    public static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint dwSize, out int lpNumberOfBytesWritten);

    public static void WriteFloatToMemory(IntPtr hProcess, IntPtr address, float value)
    {
        // Преобразуем float в массив байтов
        byte[] bytes = BitConverter.GetBytes(value);
        
        // Записываем байты в память
        WriteProcessMemory(hProcess, address, bytes, (uint)bytes.Length, out _);
    }
}
```

В этом примере:
- Функция `BitConverter.GetBytes(value)` преобразует значение `float` в массив байтов.
- Затем эта байтовая последовательность записывается по указанному адресу с помощью `WriteProcessMemory`.

Пожалуйста, учитывайте, что работа с памятью может быть связана с рисками, такими как доступ к запрещенной памяти или внесение изменений в данные других процессов, что может привести к их нестабильности. Убедитесь, что вы имеете разрешение на манипуляцию с целевыми процессами.
import struct

float_value = 3.50999999

# Преобразуем float в байты
byte_value = struct.pack('f', float_value)

# Преобразуем байты в целое число
int_value = int.from_bytes(byte_value, byteorder='little')
print(int_value)
Похожие вопросы