Avatar billede debushatta Nybegynder
01. juni 2004 - 22:37 Der er 10 kommentarer og
1 løsning

Unix-string to windows-string(dos) og omvendt

Hej med jer. Jeg ville blive meget glad, hvis i kunne hjælpe mig. Problemet er følgende. Jeg er ved skriver et program i delphi(som ligge på en windows platform) som skal kommuniker med en unix maskine. Så er der vist nok noget med, at high og low bite, er byttet om i forhold til de to styresystemer. Er der nogen der kan sige mig, hvordan man konverter fra en unix-string til en windows-string og omvendt. Mvh Søren Jepsen
Avatar billede dkn Nybegynder
01. juni 2004 - 23:02 #1
Tror nu ikke der er byttet så meget om på det, men det eneste jeg lige ved er at unix bruger en anden line end end windows som bruger #13#10.

Fandt disse 2 på delphi3000 og tror nok at det er de eneste ændringer du skal lave på din tekst:


type
TConvertNotifyKind = (nkMax, nkProgress);
TConvertNotify = procedure(Kind: TConvertNotifyKind; Value: LongInt);

// UNIXToWin -- Convert a UNIX single LF text stream to a Windows CRLF text stream
function UNIXToWin(InStream: TStream; OutStream: TStream; Notify: TConvertNotify): Boolean;
var
B, NewB: Byte;
Value: LongInt;
begin
if not Assigned(InStream) then
  begin
  Result := False;
  Exit;
  end;
if not Assigned(OutStream) then
  begin
  Result := False;
  Exit;
  end;
if Assigned(Notify) then Notify(nkMax,InStream.Size);
Value := 0;
while InStream.Position < InStream.Size do
  begin
  InStream.Read(B,SizeOf(Byte));
    case B of
    $0A: begin
          NewB := $0D;
          OutStream.Write(NewB,SizeOf(Byte));
          NewB := $0A;
          OutStream.Write(NewB,SizeOf(Byte));
          end;
    else
    OutStream.Write(B,SizeOf(Byte));
    end;
  Inc(Value);
  if Assigned(Notify) then Notify(nkProgress,Value);
  end;
if Value = InStream.Size then
  begin
  if Assigned(Notify) then Notify(nkProgress,0);
  end;
Result := True;
end;

// WinToUNIX -- Convert a CRLF Windows text stream to single LF UNIX text stream
function WinToUNIX(InStream: TStream; OutStream: TStream; Notify: TConvertNotify): Boolean;
var
B: Byte;
Value: LongInt;
begin
if not Assigned(InStream) then
  begin
  Result := False;
  Exit;
  end;
if not Assigned(OutStream) then
  begin
  Result := False;
  Exit;
  end;
if Assigned(Notify) then Notify(nkMax,InStream.Size);
Value := 0;
while InStream.Position < InStream.Size do
  begin
  InStream.Read(B,SizeOf(Byte));
    if B <> $0A then
    begin
      OutStream.Write(B,SizeOf(Byte));
    end;
    Inc(Value);
    if Assigned(Notify) then Notify(nkProgress,Value);
  end;
OutStream.Seek(SizeOf(Byte),soFromEnd);
OutStream.Read(B,SizeOf(B));
  if B <> $0D then
  begin
    B := $0D;
    OutStream.Write(B,SizeOf(Byte));
  end;
if Value = InStream.Size then
  begin
  if Assigned(Notify) then Notify(nkProgress,0);
  end;
Result := True;
end;
Avatar billede arne_v Ekspert
01. juni 2004 - 23:03 #2
Der bør ikke være nogen som helst problemer med strenge.

(Unix bruger ofte ISO-8859-1 og Windows Cp-1252 men de er stort set ens)

Det der kan give problemer er integers og little endian versus big endian.

x86 (Windows, Linux etc.) og Alpha (Tru64 Unix) er little endian.

SPARC (Solaris) og PPC (AIX) er big endian.

Og i det tilfælde skal du have vendt bytene om.
Avatar billede arne_v Ekspert
01. juni 2004 - 23:04 #3
På en little endian maskine komemr en 32 bit integer som 0x01 0x00 0x00 0x00
mens den på en big endian komemr som 0x00 0x00 0x00 0x01.

Så der skal lige skiftes og or'es lidt for at konvertere integers.
Avatar billede debushatta Nybegynder
02. juni 2004 - 15:51 #4
Problemet er, at jeg skal kommuniker med et program, der ligger på en unix-maskine. Og det skal foregå over en tcp/ip socket. Og jeg er ret sikker på at man skal vende bitene, så f.eks 10101011 kommer til at hede 11010101?
Avatar billede debushatta Nybegynder
02. juni 2004 - 15:52 #5
hvordan gøres det helt præcist?
Avatar billede arne_v Ekspert
02. juni 2004 - 16:38 #6
Det ville væget meget usædvaneligt.

Hvis du skal så laver du bare et array 0..255 med de bitvendte.

Jeg har konstanterne hvis du vil have dem.
Avatar billede arne_v Ekspert
02. juni 2004 - 16:39 #7
Men jeg finder det meget mere sandsyneligt at en 16 bit integer 00000001 00000011
skal vendes som 00000011 00000001.
Avatar billede hreiff Nybegynder
04. juni 2004 - 09:35 #8
Hvis det bare er et spørgsmål om at bytte om på de to bytes, gør du således:

Function OmbytByte(a:integer):Integer;
Begin
  result := ((a and 255) shl 8) +  ((a and -256) shr 8);
End;
Avatar billede arne_v Ekspert
07. juni 2004 - 23:27 #9
Øh ????
Avatar billede hreiff Nybegynder
08. juni 2004 - 14:05 #10
Funktionen findes faktisk som standard, så man behøver ikke selv at pille bit:
(resultatet er fuldstændig det samme som ovenfor)

Function OmbytByte(a:integer):Integer;
Begin
  result := swap(a);
End;
Avatar billede arne_v Ekspert
08. juni 2004 - 23:00 #11
Der er ikke rigtigt nogen grund til at lave en OmbytByte funktion som kun
kalder swap.

Swap opererer på smallint/word ikke på integer og denne sammenhæng tror jeg
at det er vigtigt at holde styr på.

Og så føler jeg mig lidt snydt point mæssigt.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester