2012-12-12 27 views
8

Tôi gặp sự cố khi chuyển đổi chuỗi đại diện của giá trị hex thành giá trị nguyên với Delphi.Chuyển đổi đường hex sang giá trị thập phân trong delphi

ví dụ:

$ FC75B6A9D025CB16 cho tôi 802.829.546 khi tôi sử dụng các chức năng:

Abs(StrToInt64('$FC75B6A9D025CB16')) 

nhưng nếu tôi sử dụng chương trình calc từ Windows, kết quả là: 18191647110290852630

Vì vậy, câu hỏi của tôi là: ai đúng? tôi, hoặc calc?

Có ai đã có loại vấn đề này không?

+2

Nhân tiện, rõ ràng là 802829546 không thể đúng. Biểu diễn thập phân của một số nguyên không thể có ít chữ số hơn biểu diễn thập lục phân. –

+0

bạn đang sử dụng phiên bản delphi nào? Trong Delphi XE tôi nhận được 255096963418698986 sử dụng mã của bạn mà là kết quả mong đợi ... – whosrdaddy

+0

@Andreas bắt đầu với FC - nó có thể là số âm, sau đó nó có thể ngắn hơn :-) –

Trả lời

2

Tôi đã phải sử dụng thư viện Delphi có tên "Thư viện DFF" vì tôi làm việc trên Delphi6 và loại Uint64 không tồn tại trong phiên bản này.
Main page

Dưới đây là mã của tôi để chuyển đổi một chuỗi các giá trị thập lục phân thành một chuỗi các giá trị thập phân:

Bạn cần phải thêm UBigIntsV3 mục đích sử dụng của bạn trong đơn vị của bạn.

function StrHexaToUInt64Str(const stringHexadecimal: String): string; 
var 
    unBigInteger:TInteger; 
begin 
    unBigInteger:=TInteger.Create; 
    try 
    // stringHexadecimal parameter is passed without the '$' symbol 
    // ex: stringHexadecimal:='FFAA0256' and not '$FFAA0256' 
    unBigInteger.AssignHex(stringHexadecimal); 
    //the boolean value determine if we want to add the thousand separator or not. 
    Result:=unBigInteger.converttoDecimalString(false); 
    finally 
    unBigInteger.free; 
    end; 
end; 
7

Số quá lớn để được thể hiện dưới dạng số 64 bit đã ký.

FC75B6A9D025CB16h = 18191647110290852630d 

Các ký giá trị 64-bit lớn nhất có thể là

2^63 - 1 = 9223372036854775807 
10

Trong thực tế 802829546 rõ ràng là sai ở đây .

Calc trả về giá trị không dấu 64 bit (18191647110290852630d).

Delphi Int64 loại sử dụng bit cao nhất là dấu hiệu:

Int := StrToInt64('$FC75B6A9D025CB16'); 
Showmessage(IntToStr(Int)); 

trả về giá trị -255096963418698986 đó là chính xác

Nếu bạn cần phải làm việc với các giá trị lớn hơn 64bit ký, sau đó kiểm tra Arnaud's answer here.