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.