PDA

Ver la Versión Completa : Convertir de hexadecimal a decimal


CRIS
17-07-2003, 13:38:41
Hola chicos aqui estoy de nuevo tengo un problema, necesito pasar de hexadecimal a decimal pero entre los digitos lleva un signo - (menos), como puedo pasar todos los digitos y que ignore el signo - (menos) esta es la cantidad que necesito pasar
A5FE-E0C2-65DA

Muxas gracias.CRIS.

marcoszorrilla
17-07-2003, 14:01:17
Prueba con esta función que he creado sobre la marcha:


Function HexToInt(S:String):LongInt;
begin
Result:=StrToInt( '$'+Copy( S, 1, Length(s) ) )
end;



Como es lógico habrás de pasarle el número en Hexadecimal, por lo que queda de tu cuenta utilizar el código oportuno para quitar los guiones, que supongo son separadores.

Un Saludo.

marcoszorrilla
17-07-2003, 14:25:58
Por si lo que querías era únicamente quitar el guión:


Function QuitaMenos(S:String):String;
begin

while Pos('-', S) > 0 do
Delete(s,Pos('-', S),1);

Result:=S;
end;


Le tienes que pasar una cadena, por ejemplo:
QuitaMenos('ABC-DDD');

Un Saludo.

CRIS
17-07-2003, 16:06:43
Ya funciona muxas grasiaaaaaassss ole ole ole.

Salu2.CRIS.

delphi.com.ar
17-07-2003, 16:16:05
Posteado originalmente por CRIS
¿y ahora como lo paso a decimal?
La respuesta de Marcos es para pasarlo a decimal, la inversa es IntToHex...

Saludos!

CRIS
17-07-2003, 19:59:58
Hola chicos parecia que iba bien pero pasa una cosa, si el en hexadecimal tenemos dos numero iguales seguidos o dos letras ya no sale bien la conversion, me sale una cantidad que no se asemeja a la cantidad real y ademas sale un signo - (menos) delante de la cantidad resultante. Si el hexagecimal tiene digitos que no se repiten seguidos va perfecto pero si hay dos iguales ya me sale lo comentado.

Salu2.CRIS.

delphi.com.ar
17-07-2003, 20:03:19
Me parece que lo que tu quieres convertir no es un hexadecimal "puro", para llamarlo de alguna manera. No se que significan los - que tienen en el medio, pero un hexadecimal se escriben del mismo modo que los números decimales con la salvedad que cambia la base de 10 a 16 de 0..10 o 0..F

¿Qué son esos datos que nos muestras?

CRIS
18-07-2003, 07:07:32
Hola pues esos datos son el numero de serie del disco duro, pero como ya he dicho antes, me sale el signo menos entre los digitos, por eso queria quitarle el guion y despues convertirlo a decimal, bueno chicos a ver si se os ocurre algo.Sal2.CRIS.

marcoszorrilla
18-07-2003, 08:15:09
Para obtener el número de volumen del disco duro:


function GetVolumeID(DriveChar: Char): String;
var
MaxFileNameLength, VolFlags, SerNum: DWord;
begin
if GetVolumeInformation(PChar(DriveChar + ':\'), nil, 0,
@SerNum, MaxFileNameLength, VolFlags, nil, 0)
then
begin
Result := IntToHex(SerNum,8);
Insert('-', Result, 5);
end
else
Result := '';
end;



Un Saludo.

CRIS
18-07-2003, 13:25:47
Hola, aqui pongo el codigo que yo hago para todo lo que necesito hacer, primero averiguo el numero de serie del hd despues le quito el signo (-) y despues lo convierto a decimal.
1.º El numero de serie es este 90A0-03FE
2.º Al quitarle el signo - se queda en 90A003FE
3.º Y al convertirlo me da -1868561410
¿que hago mal? aqui teneis el codigo.

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Buttons, StdCtrls;

type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
SpeedButton1: TSpeedButton;
Edit1: TEdit;
procedure FormActivate(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

Function QuitaMenos(S:String):String;
begin

while Pos('-', S) > 0 do
Delete(s,Pos('-', S),1);

Result:=S;
end;
function HexToInt(const Value: String): Integer;
begin
Result := StrToInt('$' + Value);
end;


function GetVolumeID(DriveChar: Char): String;
var
MaxFileNameLength, VolFlags, SerNum: DWord;
begin
if GetVolumeInformation(PChar(DriveChar + ':\'), nil, 0,
@SerNum, MaxFileNameLength, VolFlags, nil, 0)
then
begin
Result := IntToHex(SerNum,8);
Insert('', Result, 5);
end
else
Result := '';
end;



{$R *.dfm}

procedure TForm1.FormActivate(Sender: TObject);
begin
Label1.Caption:=GetVolumeId('c');
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin

Label2.Caption:=IntToStr( HexToInt(label1.Caption) );


end;

end.


Salu2.CRIS.

marcoszorrilla
18-07-2003, 14:51:19
Como la funcion de obtención del número de volumen del disco ya devuelve un número no veo porque se ha de pasar a hexadecimal, para despues volverlo a decimal, le hacemos los siguientes mínimos cambios y ya estaría arreglado el problema.


function GetVolumeID(DriveChar: Char): String;
var
MaxFileNameLength, VolFlags, SerNum: DWord;
begin
if GetVolumeInformation(PChar(DriveChar + ':\'), nil, 0,
@SerNum, MaxFileNameLength, VolFlags, nil, 0)
then
begin
Result := IntToStr(SerNum);
end
else
Result := '';
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
label1.Caption:=GetVolumeID('C');
end;


Un Saludo.

marcoszorrilla
18-07-2003, 14:57:27
Por error pegue código que no tenía nada que ver con la función obtener el número del volumen del disco duro, gracias a Andrés que me lo ha comunicado he recitificado dicha función

Un Saludo.

mqm
13-11-2006, 12:41:22
He probado las funciones que poneis. Pero que pasa cuando el valor de entrada es un string de 14 caracteres:
00000f0ffb3555

El resultado según la calculadora cientifica de windows deberia ser 64692630869
haciendo las pruebas oportunas con distintas funciones no me sale esto.
Esto viene que tengo que leer una secuncia de 14 caracteres.

seoane
13-11-2006, 14:02:33
Hola mqm, bienvenido al foro, si te apetece echale un vistazo a la guia de estilo (http://www.clubdelphi.com/foros/guiaestilo.php), para saber como funciona todo por aquí.

En cuanto a tu pregunta no dices con que funciones probaste, ni que error te daban, ni tampoco que versión de delphi utilizas, así que vamos a suponer que no probaste con StrToInt64. Es decir:


var
i: int64;
begin
i:= StrToInt64('$00000f0ffb3555');
ShowMessage(IntToStr(i));
end;