Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C - Sockets] 0 in hex string niet 0

Pagina: 1
Acties:

  • peterkuli
  • Registratie: September 2003
  • Laatst online: 15:07
Ik wil een hex string via een socket versturen. Omdat ik alleen de hex string weet moet deze omgezet worden naar een character string (ascii ?) omdat de standaard socket sendto() functie een character string als de te versturen message verwacht. (de te versturen message wordt naar hex geconverteerd door de functie)

Dit gaat bijna goed (in WireShark zie ik dat er bijna wordt verstuurd wat ik wil) echter gaat het mis als er een 0 gestuurd moet worden.

Code fragmentje:
C:
1
2
3
4
char tmpStr[1];
sprintf(tmpStr, "%c", hex_to_ascii(buf, 0x00));
strcpy(tmpStr, "0");
strcat(string, tmpStr);


Waarde 0x00 wordt omgezet naar ascii, in tmpStr geschreven en wordt achter string geplakt. String moet uiteindelijk verstuurd worden. Op de plek in de verstuurde hex string waar ik een 00 verwacht, staat bijv. 30 of iets anders, afhankelijk of ik %c of wat anders gebruik in sprintf.

Het einde van een string (terminator) wordt aangeduid met 0 (dus null of \0) en ik las dat dat een proleem zou kunnen geven bij strcpy en/of strcat, wat de 'vreemde' karakters kan verklaren.

Heeft iemand ervaring met sockets en weet hoe ik toch een 00 kan versturen?

(ps. het liefste heb ik natuurlijk dat ik meteen de hex string op de socket zet, zonder de omslachtige vertaalslag, maar dat ben ik helaas nog niet tegengekomen)

  • igmar
  • Registratie: April 2000
  • Laatst online: 12:26

igmar

ISO20022

sendto() verwacht een array van bytes, geen string. Vandaar dat je ook de lengte moet opgeven.

Verwijderd

Aangenomen dat hex_to_ascii een string van lengte 2 leest en een enkele byte teruggeeft, is dit dan niet wat je wilt?
code:
1
2
char result = hex_to_ascii(buf, 0x00);
sendto(&result, 1);

Geen idee wat de tweede parameter van hex_to_ascii zou moeten zijn, dus dit kan heel goed niet werken.

Zoek ook eens op wat een "hex string" of "ascii string" nu precies is, je lijkt daar wat (noodzakelijke) kennis te missen.

  • peterkuli
  • Registratie: September 2003
  • Laatst online: 15:07
Dank. Vanavond ben ik helaas niet in de gelegenheid om ermee verder te gaan, morgen kom ik er op terug.

  • Sh4wn
  • Registratie: December 2006
  • Laatst online: 12-11-2017

Sh4wn

Bio-informatica

Ik weet niet waarom jij iets wil converteren (krijg je de data ergens anders vandaan? Of krijg je het echt in de vorm van "FF AA 00"?)

Maar op de volgende manier kan je ook hex waardes sturen over de socket:
C:
1
2
3
char to_send[5] = { 0xFF, 0xFF, 0xFF, 0x05, 0x00 };

sendto(&to_send, 5); // Deze functie wordt volgens mij anders aangeroepen (met socket handles etc. er bij, maar weet ik niet uit mijn hoofd)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 14:50

.oisyn

Moderator Devschuur®

Demotivational Speaker

Misschien moet je eerst even definieren wat jij precies bedoelt met "hex string". Is dat letterlijk een string als "05f25a3b", oftewel, bestaande uit de ascii karakters '0', '5', 'f', enzovoorts? Of bedoel je eigenlijk dat je de bytes 0x05, 0xf2, 0x5a en 0x3b wilt versturen?

Dat jij er 0x30 uit krijgt is logisch - 0x30 is de ascii waarde van het teken '0'.

[ Voor 13% gewijzigd door .oisyn op 19-09-2012 19:55 ]

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.


  • evolution536
  • Registratie: Maart 2009
  • Laatst online: 05-06-2024

evolution536

besh besh

.oisyn schreef op woensdag 19 september 2012 @ 19:55:
Misschien moet je eerst even definieren wat jij precies bedoelt met "hex string". Is dat letterlijk een string als "05f25a3b", oftewel, bestaande uit de ascii karakters '0', '5', 'f', enzovoorts? Of bedoel je eigenlijk dat je de bytes 0x05, 0xf2, 0x5a en 0x3b wilt versturen?

Dat jij er 0x30 uit krijgt is logisch - 0x30 is de ascii waarde van het teken '0'.
Dit zou het wel is kunnen zijn. Als ik het goed heb gezien is "buf" een char/string in je code? Probeer het is middels een int o.i.d.

C:
1
sprintf(tmpStr, "%i", hex_to_ascii(buf, 0x00));

  • MLM
  • Registratie: Juli 2004
  • Laatst online: 12-03-2023

MLM

aka Zolo

code:
1
2
3
4
char tmpStr[1]; 
sprintf(tmpStr, "%c", hex_to_ascii(buf, 0x00)); 
strcpy(tmpStr, "0");
strcat(string, tmpStr);
Laten we even kijken wat er gebeurd in jouw code:
Regel 1: je declareert een buffer van 1 char lengte
Regel 2: BOEM programma explodeert wegens buffer overflow (je schrijft 2 chars)
(okay, onwaarschijnlijk door alignment, maar dat is al undefined behavior, maar VS in debug mode gaat al debug check falen als je returned).
Regel 3: je overschrijft de resultaten van je sprintf, wederom buffer overflow, "0" is 2 chars. tevens is "0" niet een null-terminator, maar de ASCII waarde 48 (het cijfer 0)

Misschien is het beter dat je je niet waagt aan C of C++ voordat je weet hoe buffers/C strings werken en hoe je daarmee I/O doet (bijvoorbeeld met sockets).

Verder vermoed ik een beginnersfout, "hex" is slechts een INTERPRETATIE van geheugen bytes, en een string is in C niets meer of minder dan opeenvolgende geheugen bytes, en conversie is NIET nodig in dat geval.

Verder, char == byte op afaik alle platformen.

[ Voor 5% gewijzigd door MLM op 19-09-2012 23:52 ]

-niks-


  • peterkuli
  • Registratie: September 2003
  • Laatst online: 15:07
Met 'hex string' bedoel ik inderdaad dat ik een aantal hexadecimale waardes wil versturen. Ik kijk met Wireshark wat er op het lijntje wordt gezet en dat wil ik vervolgens zelf gaan sturen. De hexadecimale waardes zijn dus bijvoorbeeld 06 bc d0 29 00. Blijkbaar bedoel ik dus de bytes 0x06 0xbc 0xd0 0x29 0x00 B)

Verder, de hex_to_ascii functie heb ik ergens vandaan gehaald omdat ik in eerste instantie dacht dat ik de 'hex waardes' om moest zetten naar een 'ascii string'.
Sh4wn schreef op woensdag 19 september 2012 @ 17:04:
C:
1
2
3
char to_send[5] = { 0xFF, 0xFF, 0xFF, 0x05, 0x00 };

sendto(&to_send, 5); // Deze functie wordt volgens mij anders aangeroepen (met socket handles etc. er bij, maar weet ik niet uit mijn hoofd)
Dit doet precies wat ik wil, dank!

En ja, ik ben op dit gebied zeker geen expert en ik ben me ervan bewust dat ik op het gebied van buffers en C strings zeker kennis tekort kom, ik zal me verder in gaan verdiepen.

Dank voor de reacties!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 11:54

Janoz

Moderator Devschuur®

!litemod

Hexadecimaal is slechts een weergave. Het is een manier om bytes te representeren. Net als je 11 weer kunt geven als 0x0b, 11 of XI. Die weergaves zijn misschien anders, maar het is allemaal nog gewoon 11.

Je gebrek aan kennis is dus niet de buffers en strings, maar het begrip dat hexadecimaal slechts een weergave is van een byte.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
In onze Getallen en talstelsels FAQ lees je alles over bits/bytes en representaties ervan :Y)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1