se a formatação gera um número hexadecimal, seria possível transformar este número em um número decimal negativo?
Claro. Dependeria só da base. Se o bit mais à esquerda for 1, será negativo. Mas nem é esse o caso. Se é um número de identificação, não há por quê conertê-lo pra decimal. Deveria ser usado
in natura. Aliás, a função que o Leonardo postou deveria devolver o número como
char e não como
long. Daí a diferença. Inclusive, a função em C armazena temporariamente o número numa variável do tipo
long sem sinal. Mas não adianta. Como o XHarbour não sabe que você quer converter o valor para
unsigned, ao executar a função de retorno
hb-retnl, ele converte com o sinal. Daí alguns números acabam chegando negativos.
Na função em alto nível, note:
Código: Selecionar todos
vhdserial := HdGetSerial(p_hddrive)
vhdserial := IIF(VALTYPE(vhdserial) == 'N',ALLTRIM(STR(vhdserial)),vhdserial) //hb_NumToHex(vhdserial)
vhdserial := SUBSTR(vhdserial,1,4) + SUBSTR(vhdserial,5,4)
O IIF() é totalmente desnecessário. A função C sempre retornará um valor do tipo numérico. Ao "converter" para caractere com STR(), ele está supondo que vai obter de volta o hexa. Errado. Então ocorrem as discrepâncias na "montagem" da ID em hexa. Mas como não é hexa, dá tudo errado. Acho que ele esqueceu de remover o comentário da rotina de conversão hb_NumToHex().