Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Valor decimal U32 o S32 a ASCIIZ

Hola a todos:
A ver como me explico para que me entendais.
Estoy usando un SDK de una aplicación con sus correspondientes offsets, y uno de ellos se supone que me debe de dar un nombre y sin embargo el resultado que obtengo es numerico.
He consultado la informacion del SDK y otras fuentes pero sigo sin entender nada.
Por lo visto el resultado que obtengo es este "1936942403" y deberia obtener esto "Cessna Skyhawk 172SP". Bien según he visto el dato que obtengo es una Valor decimal S32 o U32, que no se que es, y el que debo obtener es un ASCIIZ que tampoco tengo ni idea que es.
Parace que hay alguien que en Visual Basic lo consigue utilizando este código:
Dim b(255) as byte 'defined a byte array (256 values)
Dim result as string 'will contain the final result
Dim i as integer
FSUIPC_Read (&H3D00,256,VarPtr (b(0))) 'read all bytes at offset 3D00 in byte array
FSUIPC_Process
For i=0 to 255
If b(i)=0 then exit for 'leave at last char
result=result+Chr(b(i)) 'otherwise adds to result (don't forget the Chr)
Next

Soy novato en JAVA pero en VB ni Jota.
He probado a convertir la secuencia numerica que obtengo con (char), pero no sale nada parecido a lo que debe salir.
Si alguien entiende algo de todo esto y es tan amable de arrojar algo de luz a mi oscuridad, estare eternamente agradecido.
Un saludo.

abril 15, 2014 | Registered CommenterToiTo

U32: decimal sin signo
S32: decimal con signo
ASCIIZ: ASCII terminado en null

¿Qué SDK es ese?

abril 15, 2014 | Registered Commenterchoces

Guenas.

Quizá lo que te esta devolviendo es la posición de memoria en la que se encuentra la cadena ASCIZ que debes leer, es decir un puntero a char.

Un saludo

abril 15, 2014 | Unregistered CommenterPaposo

El SDK es FSUIPC, es para Microsoft Flight Simulator.

abril 15, 2014 | Registered CommenterToiTo

Gracias chicos por vuestras respuestas, pero sigo igual de perdido.
Sigo investigando.
Muchas gracias.
Un saludo.

abril 15, 2014 | Registered CommenterToiTo

FSUIPC_Read (&H3D00,256,VarPtr (b(0))) => Lee 256 bytes del offset de memoria 3D00 y los almacena en la variable b(0)

FSUIPC_Process => A saber lo que hace

For i=0 to 255... Lee los bytes que ha almacenado en el array de caracteres b y los imprime uno a uno como char.

Como estas accediendo a este sdk con Java? Con JNI?

He probado a convertir la secuencia numerica que obtengo con (char), pero no sale nada parecido a lo que debe salir.

Nos puedes ensenar como es el codigo con el que has hecho esto?


Un saludo

abril 15, 2014 | Unregistered CommenterUnoPorAhi

Por lo que he visto, hay una librería para Java (incluida en la distribución de ese SDK); pero es necesario compilarla, aparte de compilar un código fuente en C, que debe incluirse con esa librería, y al que se accede mediante JNI.

¿Es esa la librería que intentas usar?.

abril 15, 2014 | Registered Commenterchoces

package aeronave;

import com.flightsim.fsuipc.FSUIPC;
import com.flightsim.fsuipc.fsuipc_wrapper;

public class Aeronave {

public static int conexion;
public static String offset;

public static void Datos() {
conexion = fsuipc_wrapper.Open(fsuipc_wrapper.SIM_ANY);
FSUIPC fsuipc = new FSUIPC();
offset = Integer.toString(fsuipc.getInt(0x3d00));
fsuipc_wrapper.Close();
}

public static void main(String[] args) {
Datos();

for (int i = 0; i < offset.length(); i++) {
System.out.println((char)offset.charAt(i));
}

}
}

La parte negrita es lo que no tengo nada claro.

Un saludo

abril 15, 2014 | Unregistered CommenterToiTo

Choces, la libreria esta incluida en el proyecto, sin ella la conexion no es posible y esa parte funciona correctamente.
Muchas gracias.
Un saludo.

abril 15, 2014 | Unregistered CommenterToiTo

Por la API del wrapper que he visto en google code:
https://code.google.com/p/gdju/source/browse/trunk/src/gc/app/src/com/gerbildrop/gc/jni/FsuipcWrapper.java?r=73

Seria mas bien algo como


byte[] data;
conexion = fsuipc_wrapper.Open(fsuipc_wrapper.SIM_ANY);
conexion.readData(0x3d00, 256, data);
conexion.process();

for (int i = 0; i < data.length(); i++) {
System.out.println((char)data[i]);
}

Un saludo

abril 16, 2014 | Unregistered CommenterUnoPorAhi

Perdon, la primera linea seria:


byte[] data = new byte[256];

Y el readData:

conexion.readData(0x3d00, 255, data);

Suerte

abril 16, 2014 | Unregistered CommenterUnoPorAhi

Vaya, te lo pongo bien:


byte[] data = new byte[256];
conexion = fsuipc_wrapper.Open(fsuipc_wrapper.SIM_ANY);
fsuipc_wrapper.readData(0x3d00, 255, data);
fsuipc_wrapper.process();

for (int i = 0; i < data.length(); i++) {
System.out.println((char)data[i]);
}

abril 16, 2014 | Unregistered CommenterUnoPorAhi

UnoPorAhi, no te beso porque no llego, eso ha estado perfecto, ha funcionado perfectamente bien.
Un millon de gracias.
Un saludo.

abril 16, 2014 | Registered CommenterToiTo

Me alegro de que te funcione!


Un saludo

abril 16, 2014 | Unregistered CommenterUnoPorAhi