Ver Mensaje Individual
  #4  
Antiguo 26-05-2020
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Reputación: 14
aguml Va por buen camino
Juraría que ya te respondí pero no aparece mi respuesta así que lo vuelvo a hacer. Ya conseguí el tema de colorear y el de pasar a binario al igual que solucioné un problema con la conversión de WideString a DWORD64 que al ser grandes me daba una excepcion diciendo que no era un entero válido así que lo calculo a mano al igual que hago con los binarios jejeje.
El problema que tengo ahora es rarísimo, fuí a compilar y me dijo que había caracteres especiales y que tenía que activar el uso de UTF-8 o si no se perderían así que lo acepté y ahora al compilar me está dando un error que es claramente algún bug del RAD.
Mi código:
Código PHP:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

//Definiciones para calcular la mascara de limpieza de los HBPs marcados
#define CLEAN_HBP_DR0 0xFFFFFFFFFFF0FFFE‬
#define CLEAN_HBP_DR1 0xFFFFFFFFFF0FFFFB
#define CLEAN_HBP_DR2 0xFFFFFFFFF0FFFFEF
#define CLEAN_HBP_DR3 0xFFFFFFFF0FFFFFBF‬

#define MASK  0xFFFF0055

#define HBP_ONEXECUTE 0
#define HBP_ONWRITE   1
#define HBP_ONACCESS  3

enum LENGTH{HBP_BYTE,HBP_WORD,HBP_QWORD,HBP_DWORD};

DWORD64 Dr7;

TForm1 *Form1;

WideString Hex64ToBin(DWORD64 valor);
WideString Hex64ToWString(DWORD64 valor);

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponentOwner)
    : 
TForm(Owner)
{
}
//---------------------------------------------------------------------------

void SETBITS(DWORD64 *dr7int lowBitint bitsint newValue) {

     
int mask = (<< bits) - 1;
     *
dr7 = (*dr7 & ~(mask << lowBit)) | (newValue << lowBit);

}
//---------------------------------------------------------------------------

DWORD64 __fastcall TForm1::SetHardwareBP(void)
{
    
int Largo,Tipo;
    
Dr7=0;

    for(
int i=0;i<ComboBox1->ItemIndex+1;i++){
        
TPanel *PanelDrx = (TPanel*)Panel5->FindChildControl("PanelDr"+WideString(i));
        
TComboBox *CBTipo = (TComboBox*)PanelDrx->FindChildControl("ComboBoxTipoDr"+WideString(i));
        
TComboBox *CBLargo = (TComboBox*)PanelDrx->FindChildControl("ComboBoxLargoDr"+WideString(i));

        switch (
CBTipo->ItemIndex) {
            case 
0:
                
Tipo=HBP_ONEXECUTE;
                break;
            case 
1:
                
Tipo=HBP_ONACCESS;
                break;
            case 
2:
                
Tipo=HBP_ONWRITE;
                break;
        }

        if(
Tipo == HBP_ONEXECUTE){
            
Largo=HBP_BYTE;
        }else{
            switch (
CBLargo->ItemIndex) {
                case 
0:
                    
Largo=HBP_BYTE;
                    break;
                case 
1:
                    
Largo=HBP_WORD;
                    break;
                case 
2:
                    
Largo=HBP_DWORD;
                    break;
                case 
3:
                    
Largo=HBP_QWORD;
                    break;
            }
        }

        
SETBITS(&Dr716 42Tipo);
        
SETBITS(&Dr718 42Largo);
        
SETBITS(&Dr7211);

        
Dr7 &= MASK//Limpio la parte alta
    
}
    return 
Dr7;
}
//---------------------------------------------------------------------------

WideString Hex64ToWString(DWORD64 valor)
{
    
int restobase 16;
    
WideString salida "";
    
char hexa[]="0123456789ABCDEF";

    while(
valor >= base){ //Mientras el dividendo sea mayor o igual que el divisor, es decir, mayor o igual que 16.
        
resto valor base;
        
salida WideString(hexa[resto]) + salida//Si el resto mayor que 0 concatenamos el valor correcto del array hexa
        
valor /= base// Actualizamos el valor del dividendo dividiendolo entre 16.
    
}
    if(
valor 0)
        
salida WideString(hexa[valor]) + salida// Por último sí el valor final del dividendo es mayor que 0 concatenamos el valor que le corresponde del array hexa

    
return salida;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    
int posActivacionposTipoposLargolargo;

    
Dr7 SetHardwareBP();

    
WideString hexa Hex64ToWString(Dr7); //Obtengo el valor DWORD64 en string

    //Relleno de ceros a la izquierda hasta completar los 16 de un DWORD64
    
for(int i=hexa.Length();i<16;i++)
        
hexa "0" hexa;

    
//Le coloco el inicio de los hexadecimales
    
hexa "0x" hexa;

    
//Muestro el valor hexadecimal
    
EditDr7->Text hexa;

    
WideString bin Hex64ToBin(Dr7);  //Obtengo la cadena binaria

    //Relleno con ceros a la izquierda la cadena binaria hasta que llene los 64 bits
    
for(int i=bin.Length();i<64;i++)
        
bin "0" bin;

    
RichEditBinDr7->Lines->Clear();  //Limpio el RichEdit
    
RichEditBinDr7->Lines->Strings[0]=bin;  //Le coloco la cadena binaria

    //Obtengo el largo de la cadena binaria
    
largo WideString(RichEditBinDr7->Lines->GetText()).Length() - 1;

    
//Obtengo las posiciones iniciales de cada apartado
    
posActivacion largo 2;
    
posTipo largo 19;
    
posLargo largo 21;

    
//Doy color a todos los apartados
    
for(int i=0<= ComboBox1->ItemIndexi++){
        
RichEditBinDr7->SelStart posActivacion i*2;
        
RichEditBinDr7->SelLength 1;
        
RichEditBinDr7->SelAttributes->Color clYellow;

        
RichEditBinDr7->SelStart posTipo i*4;
        
RichEditBinDr7->SelLength 2;
        
RichEditBinDr7->SelAttributes->Color clLime;

        
RichEditBinDr7->SelStart posLargo i*4;
        
RichEditBinDr7->SelLength 2;
        
RichEditBinDr7->SelAttributes->Color clRed;
    }
}
//---------------------------------------------------------------------------

WideString Hex64ToBin(DWORD64 valor)
{
    
int restodivisor 2;
    
WideString binario "";

    while(
valor >= divisor){ //Mientras el dividendo sea mayor o igual que el divisor, es decir, mayor o igual que 2.
        
resto valor 2;
        if(
resto == 1)
            
binario "1" binario//Si el resto es igual a 1 concatenamos 1 a la variable string llamada binario
        
else
            
binario "0" binario// Sino concatemanos 0
        //Es importante este orden de concatenación (primero el bit y luego el valor de la variable) esto para que nuestro número
        //en sistema binario esté ordenado correctamente.
         
valor /= divisor// Actualizamos el valor del dividendo dividiendolo entre 2.
    
}
    if(
valor == 1)
        
binario "1" binario// Por último sí el valor final del dividendo es 1 concatenamos 1 sino concatenamos 0.
    
else
        
binario "0" binario;
    return 
binario;
}
//---------------------------------------------------------------------------


void __fastcall TForm1::Button2Click(TObject *Sender)
{
    
int posActivacionposTipoposLargolargo;

    
//Creo la mascara deseada
    
Dr7 0;
    switch(
RadioGroupMasks->ItemIndex)
    {
        case 
0:
            
Dr7 |= CLEAN_HBP_DR0;
            break;
        case 
1:
            
Dr7 |= CLEAN_HBP_DR1;
            break;
        case 
2:
            
Dr7 |= CLEAN_HBP_DR2;
            break;
        case 
3:
            
Dr7 |= CLEAN_HBP_DR3;
            break;
    }


    
WideString hexa Hex64ToWString(Dr7); //Paso la mascara de DWORD64 a string

    //Relleno con ceros a la izquierda hasta obtener los 16 de un DWORD64
    
for(int i=hexa.Length();i<16;i++)
        
hexa "0" hexa;

    
//Le coloco el inicio de los numeros hexadecimales
    
hexa "0x" hexa;

    
//Muestro el valor hexadecimal
    
EditMaskClean->Text hexa;

    
WideString bin Hex64ToBin(Dr7); //Obtengo la cadena binaria

    //Relleno con ceros a la izquierda la cadena binaria hasta que llene los 64 bits
    
for(int i=bin.Length();i<64;i++)
        
bin "0" bin;

    
RichEditBinMaskClean->Lines->Clear();  //Limpio el RichEdit
    
RichEditBinMaskClean->Lines->Strings[0]=bin;  //Le coloco la cadena binaria

    //Obtengo el largo de la cadena binaria
    
largo WideString(RichEditBinMaskClean->Lines->GetText()).Length() - 1;

    
//Obtengo las posiciones iniciales de cada apartado
    
posActivacion largo 2;
    
posTipo largo 19;
    
posLargo largo 21;

    
//Doy color a todos los apartados
    
RichEditBinMaskClean->SelStart posActivacion RadioGroupMasks->ItemIndex*2;
    
RichEditBinMaskClean->SelLength 1;
    
RichEditBinMaskClean->SelAttributes->Color clYellow;

    
RichEditBinMaskClean->SelStart posTipo RadioGroupMasks->ItemIndex*4;
    
RichEditBinMaskClean->SelLength 2;
    
RichEditBinMaskClean->SelAttributes->Color clLime;

    
RichEditBinMaskClean->SelStart posLargo RadioGroupMasks->ItemIndex*4;
    
RichEditBinMaskClean->SelLength 2;
    
RichEditBinMaskClean->SelAttributes->Color clRed;
}
//--------------------------------------------------------------------------- 
Y los errores:
Código:
[bcc32c Error] Unit1.cpp(201): invalid suffix '‬' on integer constant
[bcc32c Error] Unit1.cpp(210): invalid suffix '‬' on integer constant
El error me lo marca en el método Button2Click en las líneas:
Código PHP:
Dr7 |= CLEAN_HBP_DR0;
Dr7 |= CLEAN_HBP_DR3
Antes tambien me lo marcaba en la linea:
Código PHP:
Dr7 &= MASK//Limpio la parte alta 
Pero misteriosamente ya no lo marca ahí. Pienso que al hacer lo del UTF-8 ha metido algo que se está cargando el código pero no se que hacer para solucionarlo.
Responder Con Cita