Bytes in Int ? (SpyKee)

Friedhelm

Bekanntes Mitglied
Also ich habe ein Problem mit meinem Spykee und habe mal in der Firmware gestöbert was wohl die beiden Header-Bytes [3] + [4] sein sollen.


Versteht das einer:
Java:
#  define ntohs(x)    ( (((x) << 8) & 0xff00) | (((x) >> 8) & 255) )

memcpy(&szData, &Header[3], 2);
szData = ntohs(szData);

LOG_DEBUG("received packet: type %d, data-size = %d\n", Type, szData);
	
	if(szData > PACKET_DATA_SIZE_MAX) {

		LOG_DEBUG("error: packet size exceeded\n");
		return 0;
	}

	if(szData > *pszBuffer) {

		LOG_DEBUG("error: packet size exceeded\n");
		return 0;
	}


Was kommt bei "szData" raus, wenn man diese 2 Bytes dafür einsetzt ([3],[4]):

(byte) 1, (byte) 0x82 (bei einem MP3: 16 KB / 16 Khz)
oder
(byte) 3, (byte) 0x42 (bei einem MP3: 61 KB / 24 Khz)
oder
(byte) 2, (byte) 0x0c (bei einem MP3: 713 KB / 44 Khz)
oder
(byte) 2, (byte) 0x82 (bei einem MP3: 3,8 MB / 44 khz)


Kann das einer von Euch umrechnen und wie würde der Code zum umrechnen in Java aussehen?


Weil ich übertrage ein MP3 File, doch sind die beiden Bytes vom Header [3] + [4] bei jedem mp3 File unterschiedlich. Ich nehme an es ist die Länge aber ich bekomme es nicht zusammen.

Bin gespannt ob jemand von Euch da Licht ins dunkel bringen kann :)
 
Zuletzt bearbeitet:

Empire Phoenix

Top Contributor
Ist das da C Quellcode ? weil so sieht das aus, in dem Fall biste hier im falschen Forum (wobei es natürlicha uch hier Leute geben kann die dir evtl helfen können)
 

Friedhelm

Bekanntes Mitglied
:) So, habe das jetzt mal in
Java:
 Tags eingebunden.

Stimmt, ist C, aber das ist schon das richtige Forum :)

Weil ich das Interface in Java programmiert habe und die Firmware das SpyKees natürlich in C ist. Hatte nur nicht verstanden was ich in Java mit den 2 Bytes im Header machen soll. Irgendwann, als ich dann weiter im Quellcode stöberte :rtfm: und mir die Länge des letzten Pakets sowie die Byte-Zahlen im Hex-Editor anschaute, wurde mir dann klar, dass er die Länge des letzen Pakets bei der Übertragung der Daten braucht. Das passte dann auch alles zusammen. 

Soweit hat sich das also erledigt :toll: Musikübertragung funktioniert jetzt einwandfrei.


So sieht dann der Code in Java aus, der die Länge des letzten Pakets in die 2 Bytes umwandelt und als Header mit den letzten Daten sendet (etwas trashcoding artig, naja, es funktioniert jedenfalls :) :

[code=Java]
String hexString = Integer.toHexString(nextBytesLen+2);
				if (hexString.length() == 1) {
					hexString = "000" + hexString;
					
					mCmdSendMP3DATALastPackage[3] =   new BigInteger("00", 16).toByteArray()[0];
					mCmdSendMP3DATALastPackage[4] =   new BigInteger(hexString, 16).toByteArray()[0];
				}
				else if (hexString.length() == 2) {
					hexString = "00" + hexString;
					
					mCmdSendMP3DATALastPackage[3] =   new BigInteger("00", 16).toByteArray()[0];
					mCmdSendMP3DATALastPackage[4] =   new BigInteger(hexString, 16).toByteArray()[0];
				}
				else if (hexString.length() == 3) {
					hexString = "0" + hexString;
					
					mCmdSendMP3DATALastPackage[3] =   new BigInteger(hexString, 16).toByteArray()[0];
					mCmdSendMP3DATALastPackage[4] =   new BigInteger(hexString, 16).toByteArray()[1];
				}
				else {
					
					mCmdSendMP3DATALastPackage[3] =   new BigInteger(hexString, 16).toByteArray()[0];
					mCmdSendMP3DATALastPackage[4] =   new BigInteger(hexString, 16).toByteArray()[1];
				}
								
				System.out.println("hexString: " + hexString);
				System.out.println("data.length: " + data.length);

				sendData = concat(mCmdSendMP3DATALastPackage,data);
 
Zuletzt bearbeitet:

HoaX

Top Contributor
Schon weng umständlich wie du da die Länge berechnest ... einfacher: (ungetestet)
Java:
int laenge = nextBytesLen+2;
byte b2 = laenge & 0xff;
byte b1 = (lange >> 8) & 0xff;
 

Friedhelm

Bekanntes Mitglied
Schon weng umständlich wie du da die Länge berechnest ... einfacher: (ungetestet)
Java:
int laenge = nextBytesLen+2;
byte b2 = laenge & 0xff;
byte b1 = (lange >> 8) & 0xff;

Danke, ja ist etwas kürzer :)

Naja, eherlich gesagt weiss ich nicht was >> oder & 0xff genau machen.

Ich bekomme das hier:

data.length: 941
hexString: 3af

b1: 3
b2: -81

Kannst Du mir genau erklären was das >> und & 0xff aus 941 machen?

Und nehmen wir mal an ich habe kein >> und 0xff zur Verfügung, wie würde man das diskret aufbauen? Also mit Grundmitteln.
 

HoaX

Top Contributor
Einfach mal 1 Minute googlen ... ;)

>> und << sind Bitshift-Operatoren und & ein bitweises Und.

Mit >> 8 erden die Bits um 8 Stellen nach rechts geruckt und links mit Nullen aufgefüllt, aus 0x3ad wird also 0x3.
0xff besteht aus nur 1er Bits. Nach dem & 0xff bleiben also nur die letzten 8 Bit übrig. Also aus 0x3ad wird 0xad.

Grundlegendere Operatoren als die Bit-Operatoren gibt es nicht, selbst + - * / werden im Rechner durch diese Operatoren abgebildet.
 

Ähnliche Java Themen


Oben