Toon posts:

Java, C & sockets

Pagina: 1
Acties:

Verwijderd

Topicstarter
Java, C & sockets

De ideale combinatie.

...dacht ik.

Op dit moment draai ik een server in C, en een client in java. De communicatie gaat over sockets.

De data die over en weer verstuurd moet worden bestaat slechts uit getallen. De verstandigste manier leek mij dus om deze getallen naar characters te vertalen.

Als ik nu echter vanuit java characters ga versturen met een integer waarde levert dit problemen op. Onder de waarde 128 kan ik characters initialiseren en versturen, daarboven gaat hij fout.

Dit komt dus doordat java met signed characters werkt?

Hoe kan ik dit oplossen?

  • stylee
  • Registratie: December 2000
  • Laatst online: 04-09-2021

stylee

blah zeg ik je

Kan je op je server niet gebruik maken van een unsigned short en dan zoiets van (pseudocode):
code:
1
2
3
4
short int a;
a = ...;
a += 128;
char c = (char)a;

zoiets?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11-09 08:26

.oisyn

Moderator Devschuur®

Demotivational Speaker

chars zijn in java 16 bits en unsigned. De byte is echter wel 8 bits signed.

Het probleem zit m bij de conversie terug naar int. Stel je wilt de waarde 255 doorsturen. Dat is, vertaald naar byte in het hexadecimale stelsel, 0xff. De byte is echter signed, dus heeft ie hier de waarde -1 als je m terug converteerd. Dat komt omdat de sign-bit (de hoogste bit) 1 is, en wordt die dus gekopieerd naar de andere 24 bits van de int om de waarde van de byte weer te geven: je krijgt 0xffffffff. Maar dat wil je niet, je wilt 0x000000ff, dus je moet m anden met 0x000000ff zodat alleen die achterste 8 bits over blijven (nadat je m hebt gecast naar int)
code:
1
int i = (int)b & 0xff;

en b is dus hier de byte (signed of unsigned, haalt niet uit... nou ja, als ie unsigned is dan hoef je m sowieso niet te anden :))

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • TheOneLLama
  • Registratie: Oktober 2000
  • Laatst online: 20-01-2022

TheOneLLama

A llama like no llama before

Op dinsdag 19 maart 2002 17:01 schreef pottieman het volgende:
Java, C & sockets

De ideale combinatie.

...dacht ik.

Op dit moment draai ik een server in C, en een client in java. De communicatie gaat over sockets.

De data die over en weer verstuurd moet worden bestaat slechts uit getallen. De verstandigste manier leek mij dus om deze getallen naar characters te vertalen.
Dat lijkt mij niet de beste manier.. is een beetje verspilling van bandwith en CPU lijkt mij zo..
Verder zijn characters in JAVA 16 bit (UTF16 als ik het goed heb) en characters in c platform afhankelijk. In JAVA kan je voor je input / output stream echter wel een character encoding opgeven (in java 1.4 eindelijk op een normale manier). Dan zou je degene moeten zoeken die jou c platform gebruikt (ISO 8 nogwattes latin).

Maar als ik jou was zou ik de getallen gewoon als getallen versturen, in c (berkley sockets) heb je daar een aantal standaard functies voor die zorgen dat je geen little endian big endian problemen enzo krijgt en JAVA is platformonhankelijk (en dan gewoon een DataInputStream en DataOutputStreamgebruiken).

Mocht je ooit echte characters willen versturen dan kan ik je UTF8 encoding aanraden, goede support voor in zowel JAVA als C.

Opera OpenOffice.org Jabber Psi jabber://llama@mordax.com


Verwijderd

Hoe kan ik deze karakter encoding dan aanpassen?

  • Stephan Oudmaijer
  • Registratie: Oktober 2000
  • Laatst online: 16-08-2023
als je in java characters streamed is er geen probleem hoor dat gaat gewoon goed..

keb zelf een chat client + server die gewoon over een socket communiceren maar daar specificeer ik niets.
Pagina: 1