【问题标题】:Compare byte[] to T比较 byte[] 和 T
【发布时间】:2012-08-13 18:09:32
【问题描述】:

我想创建一个指向位置的指针列表,该位置包含另一个进程的进程内存中的某个值。该值可以是 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 类型?

【问题讨论】:

  • 你的编译器是“他”? :)
  • @Ed 奇数;当我问我的时,它说“我的名字是军团,因为我们很多”
  • 至少 3 个人(包括我自己)编辑了帖子,我们没有更改它 =)
  • @MarcGravell:我真诚地希望我的编译器没有被恶魔感染。 :D
  • 我相信他正试图反序列化/复制内存中存在的属于另一个进程的对象。 ReadMemory 正在返回 byte[],OP 希望将 byte[] 转换为数据所代表的实际对象(T 类型)。

标签: c# generics


【解决方案1】:

你的问题有点混乱,但我会尽力回答

我可能不会采用泛型类型,而是编写一个方法,该方法采用IConvertableToByteArray 之类的接口实例。

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

那么如果你需要让特定类型与那个方法兼容,你可以做一个封装类

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

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

【讨论】:

    【解决方案2】:

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

    您还应该考虑搜索内容的对齐限制 - 如果项目必须对齐 4 或 8 字节,则每次在内存中推进 1 个字节将非常缓慢且浪费。

    【讨论】:

      猜你喜欢
      • 2015-03-01
      • 2013-11-20
      • 2020-11-10
      • 1970-01-01
      • 1970-01-01
      • 2013-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多