float htonf (float x)
{
float r;
char *s1 = (char *) &x;
char *s2 = (char *) &r;
s2[0] = s1[3];
s2[1] = s1[2];
s2[2] = s1[1];
s2[3] = s1[0];
return r;
}
이를 파스칼로 바꾸려고 합니다. 일단 포인터를 배열처럼 유연하게
사용할 수가 없어서 아래와 같이 해보았습니다.
function TForm1.htonf(x : single):single;
var
r : single;
tmp : string;
s1,s2 : PChar;
begin
tmp := FloattoStr(x);
s1 := NIL;
s2 := AllocMem(4*Sizeof(PChar));
s1 := PChar(tmp);
(s2 + 0*Sizeof(Char))^ := (s1 + 3*Sizeof(Char))^;
(s2 + 1*Sizeof(Char))^ := (s1 + 2*Sizeof(Char))^;
(s2 + 2*Sizeof(Char))^ := (s1 + 1*Sizeof(Char))^;
(s2 + 3*Sizeof(Char))^ := (s1 + 0*Sizeof(Char))^;
r := StrtoFloat(s2);
Result := r;
FreeMem(s2);
end;
그런데 문제는 tmp := FloattoStr(x); 에서 4byte 의 float type을 잃어버린다는
것이죠. 예를 들어서 1234를 x 파라미터 값으로 넘겼을 때 r 이 4321 이 되지만
123 을 주었을 때는 '0123'의 byte ordering을 바꾸는 것이 아니라
FloattoStr('0123'), 즉 '123'을 바꾸어서 s1 은 3byte, s2는 4byte가 되어
에러가 나게됩니다. 최대한 C 에서 만든 함수처럼 간단하게 하고싶은데
어떻게 할 방법이 없을까요?
(99.9% 이론상으로.... -.-;;)
function htonf(x: single): single;
var
r: single;
s1, s2: PChar;
begin
s1 := PChar(@x);
s2 := PChar(@r);
s2[0] := s1[3];
s2[1] := s1[2];
s2[2] := s1[1];
s2[3] := s1[0];
Result := r;
end;
Lyle 께서 말씀하시기를...
> float htonf (float x)
> {
> float r;
> char *s1 = (char *) &x;
> char *s2 = (char *) &r;
>
> s2[0] = s1[3];
> s2[1] = s1[2];
> s2[2] = s1[1];
> s2[3] = s1[0];
>
> return r;
> }
>
> 이를 파스칼로 바꾸려고 합니다. 일단 포인터를 배열처럼 유연하게
> 사용할 수가 없어서 아래와 같이 해보았습니다.
>
> function TForm1.htonf(x : single):single;
> var
> r : single;
> tmp : string;
> s1,s2 : PChar;
> begin
> tmp := FloattoStr(x);
>
> s1 := NIL;
> s2 := AllocMem(4*Sizeof(PChar));
> s1 := PChar(tmp);
>
> (s2 + 0*Sizeof(Char))^ := (s1 + 3*Sizeof(Char))^;
> (s2 + 1*Sizeof(Char))^ := (s1 + 2*Sizeof(Char))^;
> (s2 + 2*Sizeof(Char))^ := (s1 + 1*Sizeof(Char))^;
> (s2 + 3*Sizeof(Char))^ := (s1 + 0*Sizeof(Char))^;
>
> r := StrtoFloat(s2);
> Result := r;
> FreeMem(s2);
> end;
>
> 그런데 문제는 tmp := FloattoStr(x); 에서 4byte 의 float type을 잃어버린다는
> 것이죠. 예를 들어서 1234를 x 파라미터 값으로 넘겼을 때 r 이 4321 이 되지만
> 123 을 주었을 때는 '0123'의 byte ordering을 바꾸는 것이 아니라
> FloattoStr('0123'), 즉 '123'을 바꾸어서 s1 은 3byte, s2는 4byte가 되어
> 에러가 나게됩니다. 최대한 C 에서 만든 함수처럼 간단하게 하고싶은데
> 어떻게 할 방법이 없을까요?
>