Es klappt ja auch meistens, aber leider halt nicht immer:
Code: Alles auswählen
Macro intEndian
Zahl.l = ((Zahl&$FF)<<24)+((Zahl&$FF00)<<8)+((Zahl&$FF0000)>>8)+((Zahl>>24)&$FF)
EndMacro
Dim s$(15)
;.......................................................Nach Zurückumwandlung richtig oder falsch:
s$(0) = "3 56097.28 26252.84 19.95" ; Richtig
s$(1) = "0 139163.86 187219.19 34.98" ; Xpos u.Ypos falsch
s$(2) = "0 166829.92 98857.92 134.99" ; Richtig
s$(3) = "1 139071.41 187202.56 289.99" ; Richtig
s$(4) = "2 139059.59 187209.70 205.00" ; Richtig
s$(5) = "0 139272.58 187026.08 289.97" ; Richtig
s$(6) = "0 139225.03 187012.44 244.97" ; Richtig
s$(7) = "0 139248.25 187019.81 244.97" ; Richtig
s$(8) = "0 139218.41 187091.67 304.98" ; Richtig
s$(9) = "3 139288.42 187037.50 224.98" ; Richtig
s$(10) = "2 203909.53 96981.09 154.99" ; Xpos u. Ypos falsch
s$(11) = "4 139266.13 187089.95 129.98" ; Richtig
s$(12) = "1 139300.94 187019.75 219.98" ; xpos und ypos falsch
s$(13) = "1 139201.09 187055.08 309.98" ; Richtig
s$(14) = "1 139203.16 187091.14 219.98" ; Richtig
s$(15) = "1 139274.00 187118.11 144.98" ; Nur Ypos falsch
; Strings lesen und Werte in Binärformat umwandeln
For x = 0 To 15
zeile$ = s$(x)
l2.l = Val(StringField(zeile$,1," "));Gebäudetyp
d.d = ValD(StringField(zeile$,2," "));X-Position
d1.d = ValD(StringField(zeile$,3," "));Y-Position
f.f = ValF(StringField(zeile$,4," "));Orientierung
f = -f
i5 = d/200
i6 = d1/200
j6 = (d/200 - i5)*32000
k6 = (d1/200 - i6)*32000
k7 = f*32000/360
j8 = i6 << 16 | i5 ; X-Position/200 und Y-Position/200
zahl.l = j8
intEndian
j8 = zahl
i8 = k6 << 16 | j6 ; = x-Position%200*32000 und Y-position%200 *32000
zahl = i8
intEndian
i8 = zahl
l7 = k7 << 16 | l2; & $7fff) ; Ausrichtung und Gebäudetyp
zahl = l7
intEndian
l7l = zahl
;---------------------------
;Zurückverwandeln in Stringformat
zahl.l = j8
intEndian
i1a = zahl
i2a = i1a & $ffff; xpos1
i3a = i1a >> 16 & $ffff ;ypos1
zahl.l = i8
intEndian
i5a = zahl
i8a = i5a & $ffff; xpos2
i9a = i5a >> 16 & $ffff;ypos2
zahl = l7
intEndian
i4a = zahl; type
i6a = i4a & $ffff ; type
i7a = i4a >> 16 ; orientation
xpos.f = i2a*200 + i8a*200/32000
ypos.f = i3a * 200 + i9a*200/32000
orientation.f = -(i7a*360/32000)
Debug "(" + RSet(Str(x),2,"0") + ")" + " " + Str(i6a) + " " + StrF(xpos,2) + " " + StrF(ypos,2) + " " + StrF(orientation,2)
Next
Der Java-Code sieht, soweit von Belang, so aus:
; Binär in Stringforma
int i3 = datainputstream.readInt();
int i4 = i3 & 0xffff; x-Position/200
int i6 = i3 >> 16 & 0xffff;y-Position/200
int j7 = datainputstream.readInt(); Wiederholungsfaktor, habe ich weggelassen
float f7 = 0.0F;
int l8 = 0;
While(l8 < j7)
{
int j9 = datainputstream.readInt();
int l9 = datainputstream.readInt();
int i10 = j9 & 0xffff; Gebäudetyp
int j10 = (short)(j9 >> 16); Orientierung
int k10 = l9 & 0xffff; WMod" der x-Position
int l10 = l9 >> 16 & 0xffff; "Mod" der y-Position
NumberFormat numberformat = NumberFormat.getNumberInstance(Locale.US);
numberformat.setGroupingUsed(false);
numberformat.setMaximumFractionDigits(2);
numberformat.setMinimumFractionDigits(2);
double d = (double)i4 * 200D + (double)(k10 * 200) / 32000D; Xposition
double d1 = (double)i6 * 200D + (double)(l10 * 200) / 32000D; yPosition
float f20 = -(((float)j10 * 360F) / 32000F); Orientierung
}
;Stringformat in Binär
; Gebäudetyp ermitteln, bei mir unmittelbar im String
int l2 = arraylist.indexOf(s);
; String lesen und Position/Orientierung berechnen
s = s1.substring(j2);
StringTokenizer stringtokenizer = new StringTokenizer(s);
boolean flag = Integer.parseInt(stringtokenizer.nextToken()) == 1;
double d = Double.parseDouble(stringtokenizer.nextToken());
double d1 = Double.parseDouble(stringtokenizer.nextToken());
float f;
For(f = Float.parseFloat(stringtokenizer.nextToken()); f >= 360F; f -= 360F); Ausrichtung kleiner als 360 Grad
f = -1F * f;
int i5 = (int)(d / 200D); xPos/200
int i6 = (int)(d1 / 200D); yPos/200
int j6 = (int)((d / 200D - (double)i5) * 32000D); sozusagen mod xPosition/200 *32000
int k6 = (int)((d1 / 200D - (double)i6) * 32000D); sozusagen mod yPosition/200 *32000
int k7 = (int)((f * 32000F) / 360F);
int l7 = k7 << 16 | l2 & 0x7fff;
int i8 = k6 << 16 | j6 & 0xffff;
int j8 = i6 << 16 | i5 & 0xffff;
;Ende
Der Code stammt übrigens nicht aus dem Spiel selbst, sondern von einem Tool zum Spiel, das frei verfügbar ist. Seine Funktionalität ist aber stark eingeschränkt und es ist darüber hinaus schwer zu bedienen, deshalb will ich es mit ein paar Verbesserungen nachprogrammieren. Zum Code sollte ich vieleicht noch bemerken, daß das Spiel auf einem Raster von 200 Metern beruht (daher die 200, die da immer auftauchen) und daß beim Schreiben der Binärdatei im Original zunächst alle Gebäude gesammelt werden, die im selben Rasterfeld stehen (i4 und i6) und dann entspechend dieser Gebäudezahl (j7) nur noch so häufig die Gebäudeart und, sozusagen, die %200-Werte der x und y-Positionen und die Ausrichtung geschrieben werden. Darauf kommt es bei meinem Problem aber nicht an, ich habe es also weggelassen.
Warum also zum Henker, kommen manchmal, aber nur manchmal. falsche Ergebnissse heraus? Kann eigentlich nur ein Rundungsfehler sein, aber mehr als Quad geht nicht, und auf- und Abrunden habe ich schon probiert, das bringt nicht.