Posts Tagged “binary”

I’ll post this piece of code since it could come in handy for more developers than me.

	private static HashMap decode(int[] data) {
		HashMap m = new HashMap();

		// Extract date information
		int date = data[0] << 8 | data[1];
		int year = 2000 + (date & 0x7f); // 7 bits
		int month = (date >>> 7) & 0xf; // 4 bits
		int day = (date >>> 11) & 0×1f; // 5 bits

		// Extract time information
		int millis = data[4] << 8 | data[5]; // 16 bits
		int time = data[2] << 8 | data[3];
		int minute = time & 0x3f; // 6 bits
		int hour = (time >>> 6) & 0×1f; // 5 bits
		int second = millis / 1000;
		millis = millis % 1000;

		// Construct Date object
		Calendar c = Calendar.getInstance(TimeZone.getTimeZone(”GMT+00″));
		c.set(year, month-1, day, hour, minute, second);
		c.set(Calendar.MILLISECOND, millis);
		m.put(”gpsTime”, c.getTime());

		// Extract validity
		m.put(”valid”, (time >> 31) == 1);

		// Extract latitude
		int latValue = data[6] << 24 | data [7] << 16 | data [8] << 8 | data[9];
		if((latValue>>>31) == 1) latValue = - ((~latValue) + 1);
		m.put(”latitude”, latValue * 0.0000001);

		// Extract longitude
		int lngValue = data[10] << 24 | data [11] << 16 | data [12] << 8 | data[13];
		if((lngValue>>>31) == 1) lngValue = - ((~lngValue) + 1);
		m.put(”longitude”, lngValue * 0.0000001);

		// Extract speed
		int speedValue = data[14] << 8 | data[15];
		m.put("speed", speedValue * 0.01);

		// Extract course
		int courseValue = data[16] << 8 | data[17];
		m.put("course", courseValue * 0.01);

		// Extract altitude
		int altValue = data[18] << 8 | data[19];
		m.put("altitude", altValue);

		return m;
	}

I hereby put this code into the public domain.

Share/Save/Bookmark

Comments No Comments »