2017-08-19 1 views
3

i ont cette méthode à partir d'un scanner de modèlepourquoi params byte [] argument ne fonctionne pas?

public static int FindPFM(int Module,long ModuleL,int Offset,params byte[] pattern) 
    { 

     string mask = MaskFromPattern(pattern); 
     int address, val1, val2; 

     address = FindAddress(pattern, 3, mask, Module, ModuleL); 
     val1 = ReadInt32(scanner.Process.Handle, address); 
     address = FindAddress(pattern, 18, mask, Module, ModuleL); 
     val2 = ReadByte(scanner.Process.Handle, address); 
     val1 = val1 + val2 - Module; 
     Offset = val1; 
     return Offset; 
    } 

utilisant params et b

 localPlayer = FindPFM((0x8D, 0x34, 0x85, 0x00, 0x00, 0x00, 0x00, 0x89, 0x15, 0x00, 0x00, 0x00, 0x00, 0x8B, 0x41, 0x08, 0x8B, 0x48, 0x00), dllClientAddress, dllClientSize, localPlayer); 

quand je l'utilise, mais il dit: "ne peut pas convertir int int int .... à l'octet" mais 0x8D est 1 octet et c'est un vecteur d'octets, pourquoi cette erreur apparaît alors?

Edit 1: je l'ai essayé de faire ce

 localPlayer = FindPFM(new byte[] { 0x8D, 0x34, 0x85, 0x00, 0x00, 0x00, 0x00, 0x89, 0x15, 0x00, 0x00, 0x00, 0x00, 0x8B, 0x41, 0x08, 0x8B, 0x48, 0x00 }, dllClientAddress, dllClientSize, localPlayer); 

mais il a également travaillé didnt.

+1

Lequel de ces arguments comptiez-vous correspondre à la paramètre 'pattern', et pourquoi? Une liste de valeurs séparées par des virgules entre parenthèses serait utilisée pour un littéral de tuple C# 7, mais pas pour un tableau de paramètres. –

+1

Dans la méthode delcaration le premier param est un int, le dernier est un octet []. Dans votre exemple de code appelant, il y a un tuple de "bytes". – DaveShaw

Répondre

6

Lorsque vous invoquez une méthode avec un tableau de paramètres, les arguments vont à la fin , pas le commençant (pour correspondre à la position du tableau des paramètres). Ensuite, les arguments ne vont pas entre parenthèses comme vous avez essayé de le faire - c'est la syntaxe pour un littéral en tuple C# 7. Il est un peu difficile de dire à partir des noms de paramètres et les noms d'argument, mais je pense que vous voulez:

localPlayer = FindPFM(dllClientAddress, dllClientSize, localPlayer, 
    0x8D, 0x34, 0x85, 0x00, 0x00, 0x00, 0x00, 0x89, 0x15, 0x00, 
    0x00, 0x00, 0x00, 0x8B, 0x41, 0x08, 0x8B, 0x48, 0x00); 

Voici un exemple complet ::

using System; 

public class Test 
{ 
    static void Main() 
    { 
     Foo(10, 20, 0x80, 0x8d, 0xff); 
    } 

    static void Foo(int x, int y, params byte[] bytes) 
    { 
     Console.WriteLine($"x: {x}"); 
     Console.WriteLine($"y: {y}"); 
     Console.WriteLine($"bytes: {BitConverter.ToString(bytes)}"); 
    } 
}