Q&A

  • C -> Pascal
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 에서 만든 함수처럼 간단하게 하고싶은데

어떻게 할 방법이 없을까요?



3  COMMENTS
  • Profile
    안치봉 1999.09.12 10:03
    도움이 될지는 모르겠으나... 일단은 이렇게 하면 되지 않을까 합니다.

    (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 에서 만든 함수처럼 간단하게 하고싶은데

    > 어떻게 할 방법이 없을까요?

    >





  • Profile
    Lyle 1999.09.12 10:49
    안치봉 께서 말씀하시기를...

    > 도움이 될지는 모르겠으나... 일단은 이렇게 하면 되지 않을까 합니다.

    > (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;

    >

    답변 주셔서 너무너무 고맙습니다. 지금 제가 아는 한계에 부디쳐서 여기저기에 글을 올려놓고 누군가 해결책을 제시해주길 기다리면서 밤샘을 하는 중이에요. 미련하지만 급해서 어쩔 수가 없군요.

    그런데 주신 답은 ... 안되는걸요? 쩝, 하지만 뭔가 흰트가 될 것같아 심심한 밤중에 이거저거 해보긴 하겠습니다. 부디 좋은 답변들 올려주십시오. 아멘. T_T



  • Profile
    안치봉 1999.09.12 18:23
    궁극적으로 무엇을 구현할려고 하시려는지 잘은 모르겠으나....-.-;;



    간단히 숫자의 위치를 바꾼다고 숫자가 완벽하게 역순위로 되지는 않을것 같습니다.(하지만 그 값을 문자열 값으로 변환하여 사용한다면 되겠죠)



    예를 들어 십육진수로...



    F001 을 그 방식대로 뒤집으면 01F0 이 됩니다.(바이트단위로 위치를 바꾸므로...)



    그러면 이 16진수를 십진수로 봅시다.



    F001 => 61441

    01F0 => 496



    (얼핏 보면 숫자 61441 을 뒤집으면 14416이 나올것 같지만 아닙니다)



    보듯이 10진수로 값을 보면 확현한 차이가 있습니다. 더구나 float형이면 ...



    글쎄요 ... 단지 바이트의 위치를 바꾼다는 것이 숫자를 거꾸로 뒤집는것을 가능하게 하지는 않습니다. 단 예외는 모두같은 수일때는 가능할겁니다.



    예를 들어 FFFF나 이렇게 각단위의 숫자가 모두같은 숫자요...



    어떤 변수의 값이 1234 라고 해서 그값 그대로 변수에 1234가 들어가는 것이 아닙니다. 십진수로 1234라면 실제로 기계어(?)로 보자면 그 값에는 04D2 가 들어가 있습니다.



    Lyle 께서 말씀하시기를...

    > 안치봉 께서 말씀하시기를...

    > > 도움이 될지는 모르겠으나... 일단은 이렇게 하면 되지 않을까 합니다.

    > > (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;

    > >

    > 답변 주셔서 너무너무 고맙습니다. 지금 제가 아는 한계에 부디쳐서 여기저기에 글을 올려놓고 누군가 해결책을 제시해주길 기다리면서 밤샘을 하는 중이에요. 미련하지만 급해서 어쩔 수가 없군요.

    > 그런데 주신 답은 ... 안되는걸요? 쩝, 하지만 뭔가 흰트가 될 것같아 심심한 밤중에 이거저거 해보긴 하겠습니다. 부디 좋은 답변들 올려주십시오. 아멘. T_T

    >





    • ysol
    • 1999.09.13 09:28
    • 1 COMMENTS
    • /
    • 0 LIKES
    • jinifan
      1999.09.13 11:54
      안녕 하세요? 지니팬입니다. 여기 BMP구조와 예제 하나 써넣을께요... BMP 구조는 강의실에서 이정욱님...
    • 이재식
      1999.09.13 19:38
      잘 보았습니다. 대충 무슨이야기인지는 알겠는데, 여전히 의구심만 나는 글이네요. 저에게 한번 소스를 ...
    • 김영애
    • 1999.09.13 05:58
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 권경부
      1999.09.13 09:39
      김영애 wrote: > 안녕하세요!! > 지금 어떤 프로그램(?)을 하고 있는데요... > > 전화번호 필드를 mas...
    • 박홍석
      1999.09.13 08:17
      김영애 wrote: > 안녕하세요!! > 지금 어떤 프로그램(?)을 하고 있는데요... > > 전화번호 필드를 mas...
    • 김지엽
    • 1999.09.13 05:23
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 돌팔이
      1999.09.15 05:39
      김지엽 wrote: > 늘 질문만 올려서 죄송하기 그지 없는 델파이 초보입니다. > (저도 왠만큼 배우고 나면...
    • 임성룡
    • 1999.09.12 08:16
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 문승진
      1999.09.13 23:34
      임성룡 wrote: > 1. dbgrid에서 post를 하고 다운이 되어도 세이브가 되는게 > dbisavechanges(table1...
    • 신인재
      1999.09.13 00:57
      임성룡 wrote: > 1. dbgrid에서 post를 하고 다운이 되어도 세이브가 되는게 > dbisavechanges(table1...
    • Lyle
    • 1999.09.12 05:53
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 안치봉
      1999.09.12 10:03
      도움이 될지는 모르겠으나... 일단은 이렇게 하면 되지 않을까 합니다. (99.9% 이론상으로.... -.-;;) ...
    • Lyle
      1999.09.12 10:49
      안치봉 께서 말씀하시기를... > 도움이 될지는 모르겠으나... 일단은 이렇게 하면 되지 않을까 합니다. >...
    • 안치봉
      1999.09.12 18:23
      궁극적으로 무엇을 구현할려고 하시려는지 잘은 모르겠으나....-.-;; 간단히 숫자의 위치를 바꾼다고 숫...
    • 지영근
      1999.09.12 05:50
      HUNIGA 께서 말씀하시기를... > 데이타베이스에 저장된 날짜필드와 MASKEDIT에 입력한 값을 비교하여 > ...
    • 경동욱
    • 1999.09.12 04:00
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 김영대
      1999.09.13 17:24
      경동욱 wrote: > 안녕하세요 > FTP server 프로그램을 만들려고 하는데 > server 와 client 간의 접속...
    • 강성만
    • 1999.09.12 02:18
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 문성준
      1999.09.13 22:19
      강성만 wrote: > 안녕하세요 > MS-SQL7.0과 델파이4.0을 사용 중입니다. > 인스톨 쉴드를 만들어서 프로...
    • 이정욱
      1999.09.13 12:22
      혹시 Alias 설정을 하지 않으신것 아닌지 모르겠네요. 드라이버들은 설치 되었어도 알리아스가 없어서 DB...
    • 노상균
    • 1999.09.12 02:15
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이재식
      1999.09.12 06:04
      로직이 잘못됐습니다. 귀하께서 입력과 수정을 동시에 생각하는 루틴입니까?, 아니면 입력만을 생각한 루...
    • 이우영
    • 1999.09.12 00:23
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 김영대
      1999.09.13 17:28
      안녕하세요 이우영님... 제가 저번주 내내 휴가여서 이제야 글을 보았습니다 제 홈페이지의 "NT 프로세...
    • 홍효선
    • 1999.09.11 20:54
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 안치봉
      1999.09.12 10:10
      너무질문이 막현합니다. 좀더 자세히 써주시면 좀더 명쾌한 답변이 있을것 같지 않습니까?. -.-;;(적어도 ...
    • 이재식
      1999.09.11 21:41
      그건 당연합니다. 이유는 char타입의 특성때문에 그래요. 즉, char(8)인데 막상 데이터는 aaa이면 델파...
    • jerry
    • 1999.09.11 20:40
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 지영근
      1999.09.11 21:09
      jerry 께서 말씀하시기를... > 레코드를 삽입할때 마다 그 뒤에 있는 레코드의 일련번호들이 하나씩 증가 ...
    • 홍순용
      1999.09.13 21:45
      김지혜 wrote: > 델파이 초보입니다. 레코드는 하나씩 없어지긴하는데 모든 레코드를 한꺼번에 없애는 방...
    • 지영근
      1999.09.11 20:55
      김지혜 께서 말씀하시기를... > 델파이 초보입니다. 레코드는 하나씩 없어지긴하는데 모든 레코드를 한꺼...
    • 김영대
      1999.09.13 17:30
      최은석 wrote: > 디비그리드에 메모필드를 가진 테이블을 연결했는데 > 그리드에 있는 메모필드의 내용을...