# Bytes in Int ? (SpyKee)



## Friedhelm (17. Mrz 2011)

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:

```
#  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


----------



## Friedhelm (17. Mrz 2011)

Ah, ich habs selbst rausgefunden, es war die Länge des letzten Pakets.


----------



## Andi_CH (17. Mrz 2011)

Mach das nächste mal JAVA - Tags drum herum - dann versteht es vielleicht einer


----------



## Empire Phoenix (17. Mrz 2011)

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)


----------



## Andi_CH (17. Mrz 2011)

Friedhelm hat gesagt.:


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



Hm, vielleicht war das nur eine Alibiäusserung


----------



## Friedhelm (17. Mrz 2011)

So, habe das jetzt mal in 
	
	
	
	





```
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);
```


----------



## HoaX (19. Mrz 2011)

Schon weng umständlich wie du da die Länge berechnest ... einfacher: (ungetestet)

```
int laenge = nextBytesLen+2;
byte b2 = laenge & 0xff;
byte b1 = (lange >> 8) & 0xff;
```


----------



## Friedhelm (2. Apr 2011)

HoaX hat gesagt.:


> Schon weng umständlich wie du da die Länge berechnest ... einfacher: (ungetestet)
> 
> ```
> int laenge = nextBytesLen+2;
> ...



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 (2. Apr 2011)

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.


----------



## Friedhelm (3. Apr 2011)

Super erklärt. Danke


----------

