2012-08-13 24 views
5

Quiero hacer una lista de punteros a ubicaciones que contienen un cierto valor en la memoria de proceso de otro proceso. El valor puede ser un corto, int, largo, cadena, bool u otra cosa.Comparar byte [] a T

Mi idea es utilizar genéricos para esto. Tengo un problema al crearlo, ¿cómo puedo decirle al compilador qué tipo necesita para convertir la matriz de bytes?

Esto es lo que hice:

public List<IntPtr> ScanProccessFor<T>(T ItemToScanFor) 
    { 
     List<IntPtr> Output = new List<IntPtr>(); 

     IntPtr StartOffset = SelectedProcess.MainModule.BaseAddress; 
     int ScanSize = SelectedProcess.MainModule.ModuleMemorySize; 

     for (int i = 0; i < ScanSize; i++) 
      if (ReadMemory(SelectedProcess, StartOffset + i, (UInt16)Marshal.SizeOf(ItemToScanFor)) == ItemToScanFor) 
       Output.Insert(Output.Count,StartOffset + i); 

     return Output; 
    } 

¿Cómo puedo decirle al compilador que necesita para convertir el byte [] para escribir T?

+6

¿Tu compilador es un "él"? :) –

+6

@Ed impar; cuando le pregunto a los míos, dice "Mi nombre es legión, porque somos muchos" –

+2

Al menos 3 tipos (yo incluido) corrigieron la publicación y no la cambiamos =) –

Respuesta

2

Su pregunta es un poco confuso, pero voy a tratar de responder a lo que puedo

En lugar de tomar un tipo genérico, probablemente escribir un método que toma una instancia de una interfaz como IConvertableToByteArray o algo .

public IConvertableToByteArray 
{  
    public byte[] ToByteArray(); 
} 

Entonces, si usted necesita para permitir que un tipo específico para que sea compatible con ese método, se puede hacer una clase de encapsulación

public IntConvertableToByteArray : IConvertableToByteArray 
{ 
    public int Value{get; set;} 

    public byte[] ToByteArray() 
    { 
     insert logic here 
    } 
} 
1

Usted podría utilizar Marshal.StructureToPtr para obtener una representación no gestionado de la estructura (que tiene que ser una estructura 'simple'). Sin embargo, puede necesitar cadenas de casos especiales.

También debe pensar en las restricciones de alineación en lo que está buscando: avanzar a través de la memoria 1 byte a la vez será muy lento y derrochador si el elemento debe estar alineado 4 u 8 bytes.