2010-06-17 17 views
5

Tôi muốn biết làm thế nào để chuyển đổi số lớn-endian để số bản địa trong Delphi. Tôi đang chuyển một số mã C++ trong đó tôi bắt gặp:làm thế nào để chuyển đổi số lớn-endian để số bản địa delphi

unsigned long blockLength = *blockLengthPtr++ << 24; 
blockLength |= *blockLengthPtr++ << 16; 
blockLength |= *blockLengthPtr++ << 8; 
blockLength |= *blockLengthPtr; 

unsigned long dataLength = *dataLengthPtr++ << 24; 
dataLength |= *dataLengthPtr++ << 16; 
dataLength |= *dataLengthPtr++ << 8; 
dataLength |= *dataLengthPtr; 

Tôi không quen với C++, vì vậy tôi không hiểu những gì các nhà khai thác đó làm.

+0

có thể trùng lặp [Cách chuyển đổi Big Endian và cách lật bit cao nhất?] (http://stackoverflow.com/questions/2882434/how-to-convert-big-endian-and-how-to-flip-the-highest-bit) –

Trả lời

16

Câu trả lời của Andreas là một ví dụ khá hay về cách thực hiện nó trong pascal thuần túy, nhưng nó vẫn trông khá khó xử, giống như mã C++. Điều này thực sự có thể được thực hiện trong một hướng dẫn lắp ráp đơn, mặc dù cái nào phụ thuộc vào việc bạn đang sử dụng các số nguyên 32 bit hay 16 bit:

function SwapEndian32(Value: integer): integer; register; 
asm 
    bswap eax 
end; 

function SwapEndian16(Value: smallint): smallint; register; 
asm 
    xchg al, ah 
end; 
+0

Bạn không cần phải chỉ định gọi quy ước, ít nhất là không cho Delphi (không biết về Pascal miễn phí). 'register' là mặc định. –

+2

Đây là giải pháp *, sau đó! –

+4

Bạn không * cần * để chỉ định quy ước gọi điện, @Michael, nhưng sẽ hữu ích khi đưa nó vào các chức năng lắp ráp như thế này vì chúng yêu cầu * một quy ước gọi cụ thể để hoạt động chính xác. –

2

Để đảo ngược thứ tự của các bit:

procedure SwapEndiannessOfBits(var Value: cardinal); 
var 
    tmp: cardinal; 
    i: Integer; 
begin 
    tmp := 0; 
    for i := 0 to 8*sizeof(Value) - 1 do 
    inc(tmp, ((Value shr i) and $1) shl (8*sizeof(Value) - i - 1)); 
    Value := tmp; 
end; 

Để đảo ngược thứ tự của các byte:

procedure SwapEndiannessOfBytes(var Value: cardinal); 
var 
    tmp: cardinal; 
    i: Integer; 
begin 
    tmp := 0; 
    for i := 0 to sizeof(Value) - 1 do 
    inc(tmp, ((Value shr (8*i)) and $FF) shl (8*(sizeof(Value) - i - 1))); 
    Value := tmp; 
end; 

Tôi nghĩ người cuối cùng là những gì bạn đang tìm kiếm. Nhiều khả năng có những giải pháp nhanh hơn và thanh lịch hơn, mặc dù.

Tuyên bố từ chối trách nhiệm: Tôi có thể hoàn toàn sai. Tôi cảm thấy hơi bối rối vào lúc này. Hy vọng rằng ai đó sẽ thấy câu hỏi này và cung cấp một câu trả lời rõ ràng hơn!

Các vấn đề liên quan