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(TComponent* Owner)
    : 
TForm(Owner)
{
}
//---------------------------------------------------------------------------

void SETBITS(DWORD64 *dr7, int lowBit, int bits, int newValue) {

     
int mask = (1 << 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(&Dr7, 16 + i * 4, 2, Tipo);
        
SETBITS(&Dr7, 18 + i * 4, 2, Largo);
        
SETBITS(&Dr7, i * 2, 1, 1);

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

WideString Hex64ToWString(DWORD64 valor)
{
    
int resto, base = 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 posActivacion, posTipo, posLargo, largo;

    
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; i <= ComboBox1->ItemIndex; i++){
        
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 resto, divisor = 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 posActivacion, posTipo, posLargo, largo;

    
//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