2012-11-23 2 views
0
  1. "a"변수를 HostToNetwork()에 전달하는 방법은 무엇입니까? 어떻게 든 그것을 변환해야합니다 ...
  2. 그리고 "16 진수"변수에 삽입하는 방법? IdStack.pas에서GStack.HostToNetwork 입력 유형 - Shortint?

    var 
    a : array[0..19] of Shortint; 
    h : string; 
    
    h =: '714BD6D36D4944F4E4F943CB03D128EA5C372FF6'; 
    
    GStack.HostToNetwork(a) 
    

:

function HostToNetwork(AValue: Word): Word; overload; virtual; abstract; 
function HostToNetwork(AValue: LongWord): LongWord; overload; virtual; abstract; 
function HostToNetwork(AValue: Int64): Int64; overload; virtual; abstract; 
function HostToNetwork(const AValue: TIdIPv6Address): TIdIPv6Address; overload; virtual; 

감사

편집 :

h := '714BD6D36D4944F4E4F943CB03D128EA5C372FF6'; 
    for x := 0 to 19 do 
    begin 
     a[x] := StrToInt('$'+Copy(h, x, 2)); 
    end; 

맞습니까?

+0

무엇을 할 예정입니까? 나열된 ['HostToNetwork'] (http://www.indyproject.org/docsite/html/frames.html?frmname=topic&frmfile=%21%21OVERLOADED_HostToNetwork_TIdStack.html) 메소드는 모두 추상 적이기 때문에 묻습니다. 첫 번째 오버로드를 호출하는 마지막 것. 간단히 말해서, 그들은 '[TIdStack'] (http://www.indyproject.org/docsite/html/frames.html?frmname=topic&frmfile=TIdStack.html) 기본 클래스에서 아무 것도하지 않습니다. – TLama

+0

HostifiedNetwork를 사용하여 전달 된 데이터 (int/int64 및 이제는 shortint가 필요함)를 "빅 엔디안" – waza123

+0

@ waza123 (1 바이트 크기 데이터의 경우)로 변환하는 경우 메모리 내 표현이 동일하기 때문에 바이트 엔디안은 의미가 없습니다! – jachguate

답변

2

Shortint은 1 바이트 크기이므로 엔디안의 영향을받지 않습니다. GStack.HostToNetwork()GStack.NetworkToHost() 메서드는 대신 멀티 바이트 정수에서만 작동합니다. 따라서이 예제에서는 GStack 메서드를 사용하는 것이 타당하지 않습니다. 20 개의 원시 바이트 배열을 선언하고 있습니다. 먼저 바이트를 정수로 나눠서 변환해야합니다. 분할 한 후에는 필요에 따라 개별적으로 GStack에 전달할 수 있습니다.

earlier question을 기반으로하면 실제로 원시 바이트가 아닌 정수 레코드를 처리하게됩니다. 정수를 네트워크 바이트 순서로 변환해야합니다. BEFORE 레코드를 원시 바이트로 인코딩 한 다음 정수를 호스트 바이트 순서 으로 변환 한 후 처음으로 원시 바이트를 레코드로 디코딩했습니다. 예 :

type 
    Tconnecting = packed record 
    a: int64; 
    b: integer; 
    c: integer; 
    end; 

var 
    packet: Tconnecting; 
    send_data: TIdBytes; 
begin 
    packet.a := $1234567890; 
    packet.b := 0; 
    packet.c := RandomRange(1, 9999999); 

    packet.a := GStack.HostToNetwork(packet.a); 
    packet.b := Integer(GStack.HostToNetwork(LongWord(packet.b))); 
    packet.c := Integer(GStack.HostToNetwork(LongWord(packet.c))); 

    send_data := RawToBytes(packet, SizeOf(packet)); 
    udp.SendBuffer(send_data); 
end; 

.

var 
    Treply = packed record 
    c: integer; 
    b: integer; 
    a: int64; 
    end; 

var 
    packet: Tconnecting; 
    received_data: TIdBytes; 
begin 
    SetLength(received_data, SizeOf(Treply)); 
    if udp.ReceiveBuffer(received_data) = SizeOf(Treply) then 
    begin 
    BytesToRaw(received_data, packet, SizeOf(Treply)); 

    packet.a := GStack.NetworkToHost(packet.a); 
    packet.b := Integer(GStack.NetworkToHost(LongWord(packet.b))); 
    packet.c := Integer(GStack.NetworkToHost(LongWord(packet.c))); 

    // use packet as needed ... 
    end; 
end;