将 byte[] 与 T 进行比较

5

我想制作一个指向另一个进程的进程内存中包含某个值的位置的指针列表。该值可以是short、int、long、string、bool或其他类型。

我的想法是使用泛型来实现。但我在制作时遇到了一个问题,如何告诉编译器将字节数组转换为哪种类型?

这是我制作的内容:

    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;
    }

我该如何告诉编译器将byte[]转换为类型T?

6
你的编译器是“他”吗? :) - Ed S.
6
@Ed 奇怪,当我问我的时候,它说:“我们的名字是军团,因为我们很多。” - Marc Gravell
2
至少有3个人(包括我自己)编辑了这篇帖子,但我们没有改变它=) - Andre Calil
@MarcGravell:我真诚地希望我的编译器没有被恶魔感染。 :D - Ed S.
1
我相信他正在尝试反序列化/复制一个存在于另一个进程内存中的对象。ReadMemory返回byte[],而OP希望将该byte[]转换为数据所表示的实际对象(类型为T)。 - Jaime Torres
显示剩余2条评论
2个回答

2

您的问题有点令人困惑,但我会尽力回答我能回答的部分。

与其使用通用类型,我可能会编写一个接受IConvertableToByteArray接口实例的方法或类似的东西。

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

如果您需要让特定类型与该方法兼容,可以创建一个封装类。

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

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

1

您可以使用Marshal.StructureToPtr来获取结构体的非托管表示(该结构体必须是“简单”的结构体)。但是,您可能需要特殊处理字符串。

您还应考虑所搜索内容的对齐约束——如果该项必须是4或8字节对齐,则逐字节地在内存中前进将非常缓慢和浪费。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接