Foros Club Delphi

Foros Club Delphi (http://www.clubdelphi.com/foros/index.php)
-   .NET (http://www.clubdelphi.com/foros/forumdisplay.php?f=17)
-   -   Problemas con uso de fixed (http://www.clubdelphi.com/foros/showthread.php?t=92682)

aguml 29-12-2017 21:51:55

Problemas con uso de fixed
 
Todos los errores son por el uso de fixed que no se bien lo que hace y la explicacion que veo no me entero de mucho. Estos son los errores:
Código:

Error        1        No se puede declarar una variable local denominada 'ptr' en este ámbito, porque daría un significado diferente a 'ptr', que ya se utiliza en un ámbito 'secundario' con otra denotación        C:\Documents and Settings\BlueDeep\Mis documentos\Visual Studio 2010\Projects\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs        225
Error        2        No se puede declarar una variable local denominada 'ptr2' en este ámbito, porque daría un significado diferente a 'ptr2', que ya se utiliza en un ámbito 'secundario' con otra denotación        C:\Documents and Settings\BlueDeep\Mis documentos\Visual Studio 2010\Projects\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs        227
Error        3        No se puede declarar una variable local denominada 'ptr' en este ámbito, porque daría un significado diferente a 'ptr', que ya se utiliza en un ámbito 'primario o actual' con otra denotación        C:\Documents and Settings\BlueDeep\Mis documentos\Visual Studio 2010\Projects\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs        245
Error        4        No se puede declarar una variable local denominada 'ptr2' en este ámbito, porque daría un significado diferente a 'ptr2', que ya se utiliza en un ámbito 'primario o actual' con otra denotación        C:\Documents and Settings\BlueDeep\Mis documentos\Visual Studio 2010\Projects\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs        247
Error        5        No se puede utilizar la instrucción fixed para adquirir la dirección de una expresión de tipo fixed        C:\Documents and Settings\BlueDeep\Mis documentos\Visual Studio 2010\Projects\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs        266
Error        6        No se puede declarar una variable local denominada 'ptr2' en este ámbito, porque daría un significado diferente a 'ptr2', que ya se utiliza en un ámbito 'secundario' con otra denotación        C:\Documents and Settings\BlueDeep\Mis documentos\Visual Studio 2010\Projects\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs        283
Error        7        No se puede declarar una variable local denominada 'ptr' en este ámbito, porque daría un significado diferente a 'ptr', que ya se utiliza en un ámbito 'secundario' con otra denotación        C:\Documents and Settings\BlueDeep\Mis documentos\Visual Studio 2010\Projects\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs        285
Error        8        No se puede declarar una variable local denominada 'ptr' en este ámbito, porque daría un significado diferente a 'ptr', que ya se utiliza en un ámbito 'primario o actual' con otra denotación        C:\Documents and Settings\BlueDeep\Mis documentos\Visual Studio 2010\Projects\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs        303
Error        9        No se puede utilizar la instrucción fixed para adquirir la dirección de una expresión de tipo fixed        C:\Documents and Settings\BlueDeep\Mis documentos\Visual Studio 2010\Projects\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs        303
Error        10        No se puede declarar una variable local denominada 'ptr2' en este ámbito, porque daría un significado diferente a 'ptr2', que ya se utiliza en un ámbito 'primario o actual' con otra denotación        C:\Documents and Settings\BlueDeep\Mis documentos\Visual Studio 2010\Projects\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs        305
Error        11        No se puede utilizar la instrucción fixed para adquirir la dirección de una expresión de tipo fixed        C:\Documents and Settings\BlueDeep\Mis documentos\Visual Studio 2010\Projects\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs        305
Error        12        Se esperaba un identificador        C:\Documents and Settings\BlueDeep\Mis documentos\Visual Studio 2010\Projects\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs      93

y aqui el codigo como lo tengo ahora mismo: https://pastebin.com/EM1AknZe
Os estaria muy agradecido si me pudierais echar un cable con esto.

aguml 01-01-2018 01:31:43

Esta función ¿sería válida así?
Código PHP:

public unsafe byte[] DecryptAll(byte[] eData)
{
    
byte[] array = new byte[(int)eData.Length];
    
intptrInt1;
    
intptrInt2;
    
    if (
eData != null && (int)eData.Length !=0)
    {
        
fixed (byteptrByte1 = &eData[0])
        {
            
ptrInt1=(int*)ptrByte1;
        }
    }
    else
    {
        
fixed (byteptrByte1 = (byte[]) null)
        {
            
ptrInt1=(int*)null;
        }
    }
    
byte[] array2;
 
    if ((
array2 = array) != null &&(int)array2.Length != 0)
    {
        
fixed (byteptrByte2 = &array2[0])
        {
             
ptrInt2=(int*)ptrByte2;
        }
    }
    else
    {
        
fixed (byteptrByte2 = (byte[])null)
        {
            
ptrInt2=(int*)null;
        }
    }
    for (
int i 0< (int)eData.Length >> 3;+= 1)
    {
        
int num1 ReverseDWORD(*ptrInt1);
        
ptrInt1++;
        
int num2 ReverseDWORD(*ptrInt1);
        
ptrInt1++;
        
this.Desencriptar(ref num1ref num2);
        
num1 = (*ptrInt2 ReverseDWORD(num1));
        
ptrInt2++;
        
num2 = (*ptrInt2 ReverseDWORD(num2));
        
ptrInt2++;
    }
    return array;


La idea es ir cogiendo del array byte[] eData 2 enteros y encriptarlos, voy incrementando los punteros para ir accediendo al siguiente lugar de la memoria donde estará el siguiente entero.

aguml 03-01-2018 08:38:14

Solucionado

Casimiro Notevi 03-01-2018 09:16:37

¿Cómo? :confused:

aguml 04-01-2018 12:53:55

Pues como indiqué arriba. En C++ puedes hacer esto:
Código PHP:

byte array[125];
int *ptr=(int*)array;
*
ptr=0x12345678;
ptr++
*
ptr=0x88888888

En C# tienes que indicar que es código no seguro con unsafe cuando intentas hacer un cast de ese tipo y además hacerlo en una zona fixed y usar un puntero auxiliar para el casting:
Código PHP:

byte[125] array;
intptrInt;
    
fixed (byteptrByte = array)
{
    
ptrInt=(int*)ptrByte;
}
*
ptrInt=0x12345678;
ptrInt++;
*
ptrInt=0x88888888



La franja horaria es GMT +2. Ahora son las 04:56:42.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi