[C++] ASCII naar begrijpelijke tekst

Pagina: 1
Acties:
  • 133 views sinds 30-01-2008
  • Reageer

  • IJnte
  • Registratie: Juni 2003
  • Laatst online: 19-05 12:01
Ik heb een klein probleem waar ik niet uitkom. :?

Ik krijg van een stukje software een 16Bytes ASCII String terug. Dit ziet er uit als "1330791758".
Hoe kan ik hier begrijpelijke tekst van maken?? Kan dit uberhaupt?

Ik heb gezocht op ASCII to string, en alles wat een beetje te maken had met ASCII maar ik kan de oplossing voor het probleem niet vinden.

Exploring the world by bicycle! cyclingsilk.wordpress.com


  • NetForce1
  • Registratie: November 2001
  • Laatst online: 23-03 10:29

NetForce1

(inspiratie == 0) -> true

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


  • IJnte
  • Registratie: Juni 2003
  • Laatst online: 19-05 12:01
Jah maar ik snap echt niet hoe ik dat om moet zetten. Het is een 16 byte ASCII string, ik snap eigenlijk nog niet precies wat dit in mag houden. Ik heb al in die ASCII tabel gekeken maar ik zie niet precies de mogelijkheden.

Exploring the world by bicycle! cyclingsilk.wordpress.com


  • NetForce1
  • Registratie: November 2001
  • Laatst online: 23-03 10:29

NetForce1

(inspiratie == 0) -> true

ok, ik snapte je probleem eerlijk gezegd niet helemaal net. Nu wel hoop ik :P. Staat er niet iets meer info in de documentatie van de betreffende software? Normaal gesproken is een ASCII-teken volgens mij 2 bytes lang, dus wat hier 16 bytes aan is snap ik ook niet helemaal. Maar misschien dat het met iets meer info helderder word.

edit: een ascii is dus 1 byte (zie el psycho), klein rekenfoutje van mij (tis al laat hé :P)

[ Voor 13% gewijzigd door NetForce1 op 14-09-2004 23:59 ]

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


  • El Psycho
  • Registratie: September 2002
  • Laatst online: 13-05 13:40
1 ascii character is 7 bits. 1 extended ascii character is 8 bits, dus een byte. Een 16 byte string is dus een string van 16 characters. Behalve als die 16 bytes slaan op de benodigde ruimte voor de string op te slaan dan zijn het er maar 15 gevolgd door het '\0' character.

Wat voor soort string verwacht je eigenlijk uit je programma? Want die string van 10 characters die je hier quote zou wel es gewoon de output kunnen zijn.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
Ik denk dat je eerst moet weten wat die string die je terugkrijgt betekent. ( Het feit dat je kunt lezen dat er getallen instaan, betekent eigenlijk al dat je ASCII binnenkrijgt )

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

[DC3] 0 Y  [ETB] :
Ofwel, vrije interpretatie: let op device3, "0 Y", einde datablock, release de bus.

Tsja, verder kan dit wel van alles betekenen en voor doel hebben. Wat voor stukje software/hardware spuugt dit uit? Welk protocol?

[ Voor 8% gewijzigd door Verwijderd op 14-09-2004 23:59 ]


  • NetForce1
  • Registratie: November 2001
  • Laatst online: 23-03 10:29

NetForce1

(inspiratie == 0) -> true

Verwijderd schreef op 14 september 2004 @ 23:58:
<pre>[DC3] 0 Y [ETB] :</pre>Ofwel, vrije interpretatie: let op device3, "0 Y", einde datablock, release de bus.

Tsja, verder kan dit wel van alles betekenen en voor doel hebben. Wat voor stukje software/hardware spuugt dit uit? Welk protocol?
Opzich wel leuk om te weten hoe je daar aan komt :P Vooral voor TS denk ik we zijn niet allemaal die-hard CME-er

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


  • IJnte
  • Registratie: Juni 2003
  • Laatst online: 19-05 12:01
Ik ben bezig met ASPI programmeren. Ik probeer de naam van de hostadapter uit te lezen. Ik heb de documentatie erbij van aspi en daar staat in:
code:
1
2
Host Adapter Identifier. This field contains a 16-byte ASCII string 
describing the SCSI Host adapter.

Ook kan ik de Manager ID uitlezen:
code:
1
2
SCSI Manager ID. This field contains a 16-byte ASCII string describing the SCSI
 manager.  For ASPI for Win32 the string "ASPI for WIN32" shall be returned.

Ik kan deze waardes dus allemaal netjes uitlezen. Ik krijg het alleen terug in getallen zoals in mijn eerste post beschreven staat.

De waardes die ik terugkrijg voor:
Host adapter Identifier: 1885434977
Manager ID: 1330791758

Deze waardes moet ik dus omzetten in begrijpelijke tekst. Als iemand me daarmee kan helpen ben ik erg blij _/-\o_

[ Voor 1% gewijzigd door IJnte op 15-09-2004 00:10 . Reden: typo ]

Exploring the world by bicycle! cyclingsilk.wordpress.com


Verwijderd

wel leuk om te weten hoe je daar aan komt
Nou, door de [DC3] en [ETB] moest ik moest denken aan variaties van 1 wire protocols. Daar wordt dan eerst een startbyte gegeven met daarin je devicenummer (waarvan je aandacht wilt / of die de gegevens gaat sturen op de bus), daarna worden de gegevens verzonden gevolgd door een stopbyte en een release. In dit voorbeeld zou het dan device 3 zijn die met meet/statusgegevens "0 Y" komt.
Voor de rest: zie Reptile209 :w

Maar goed, dat is in geval dus niet van toepassing, zie de posting hierboven mij :)

[ Voor 43% gewijzigd door Verwijderd op 15-09-2004 00:15 ]


  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 22:59

Reptile209

- gers -

NetForce1 schreef op 15 september 2004 @ 00:03:
[...]

Opzich wel leuk om te weten hoe je daar aan komt :P Vooral voor TS denk ik we zijn niet allemaal die-hard CME-er
* Reptile209 kopt 'm wel even in:

Splits de string in blokjes van 2 cijfers (1 byte = 0-255 decimaal ofwel 00-ff hexadecimaal): 13 30 79 17 58. Interpreteer die mbv de link van NetForce1 (kolom 2 - Hex) naar de crap die euss schreef. Maar dat zijn dus niet de door de TS beloofde 16 bytes... :). Dit soort dingen kan je alleen maar interpreteren als je weet wat er ongeveer zou moeten kunnen staan. Anders is het zoiets als alle letters van een A4-tje op een hoop vegen en dan de oorspronkelijke tekst raden.

edit:
Laaaat, veeeel te laaaat :(
:w euss


Edit2:
Op de twee getallen die je noemt, kan je hetzelfde doen:
1885434977 = 0x70617461 (hexadecimaal)
70 61 74 61 via die ascii-tabel is "pata"

Hetzelfde met 1330791758 = 4F52454E = "OREN"

En omdat dit soort strings meestal van achter naar voren worden opgebouwd zeg ik: "atap NERO" ofzo.

In C++ kan je dit met behulp van unions heel gemakkelijk splisten naar een leesbare string. Uit het blote bolletje:
C:
1
2
3
4
5
6
7
8
9
10
11
union {
  dword waarde;
  char woord[4];
} Woot;
...

Woot w00t;
w00t.waarde := 1330791758;
for(int i:=3; i>=0; i--){
  putch(w00t.woord[i]);
}

Please forgive my French if you code C :)

[ Voor 37% gewijzigd door Reptile209 op 15-09-2004 00:22 ]

Zo scherp als een voetbal!


  • IJnte
  • Registratie: Juni 2003
  • Laatst online: 19-05 12:01
Thnx euss. Ik heb al die PDF's al doorgebladert, en alle nuttige informatie hieruit gehaald. Ik heb zelfs een boek gekocht over SCSI en ASPI programmeren > The book of SCSI.
In al die documenten die euss aandraagt, staat hetzelfde, namelijk dat het een 16bytes ASCII waarde is.

Exploring the world by bicycle! cyclingsilk.wordpress.com


  • El Psycho
  • Registratie: September 2002
  • Laatst online: 13-05 13:40
Hoe precies krijg je die waardes uit je 'software' via een struct die je uit een functie krijgt of zo? Zo ja, wat zijn de definities van je struct en de functie die je aanroept?
Oftewel laat es de relevante code zien die tot dit resultaat leidt.

Edit:
Reptile209 schreef op 15 september 2004 @ 00:11:
En omdat dit soort strings meestal van achter naar voren worden opgebouwd zeg ik: "atap NERO" ofzo.
atap als start van Atapi drive en NERO als start van NERO Imagedrive zeker... maar als dat klopt heeft ts nog maar 4 van de 16 bytes die ts verwacht

[ Voor 64% gewijzigd door El Psycho op 15-09-2004 00:36 ]


  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 22:59

Reptile209

- gers -

Gezien het aantal hits bij [google=atap NERO] denk ik dat ik niet geheel ongelijk zou kunnen hebben in deze context :).

Edit2 dus in [rml]Reptile209 in "[ C++] ASCII naar begrijpelijke tekst"[/rml]

Zo scherp als een voetbal!


  • IJnte
  • Registratie: Juni 2003
  • Laatst online: 19-05 12:01
Reptile209 schreef op 15 september 2004 @ 00:11:
[...]

Anders is het zoiets als alle letters van een A4-tje op een hoop vegen en dan de oorspronkelijke tekst raden.

edit:
Laaaat, veeeel te laaaat :(
:w euss


Edit2:
Op de twee getallen die je noemt, kan je hetzelfde doen:
1885434977 = 0x70617461 (hexadecimaal)
70 61 74 61 via die ascii-tabel is "pata"

Hetzelfde met 1330791758 = 4F52454E = "OREN"

En omdat dit soort strings meestal van achter naar voren worden opgebouwd zeg ik: "atap NERO" ofzo.

In C++ kan je dit met behulp van unions heel gemakkelijk splisten naar een leesbare string. Uit het blote bolletje:
C:
1
2
3
4
5
6
7
8
9
10
11
union {
  dword waarde;
  char woord[4];
} Woot;
...

Woot w00t;
w00t.waarde := 1330791758;
for(int i:=3; i>=0; i--){
  putch(w00t.woord[i]);
}

Please forgive my French if you code C :)
Thnx je hebt gelijk! _/-\o_ Ik ben er nu mee aan het stoeien geweest, maar krijg nog steeds rare waardes. Allereerst zou ik een deel van mijn code tonen:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
  pfnSendASPI32Command( (LPSRB)&srbHAInquiry);

  if (srbHAInquiry.SRB_Status != SS_COMP) // Als er een error optreed
  {
   ShowMessage("Error");
  }
  dwManagerID = *(DWORD *)(srbHAInquiry.HA_ManagerId);
  ShowMessage(dwManagerID);        // Laat manager ID zien
  dwIdentifier = *(DWORD *)(srbHAInquiry.HA_Identifier);
  ShowMessage(dwIdentifier);       //Laat Identifier zien
  dwUnique = *(DWORD *)(srbHAInquiry.HA_Unique);
  ShowMessage(dwUnique);          //Laat Unique zien

srbHAInquiry is de naam van een struct die als volgt gedefinieerd is(Zit standaard in ASPI):
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
typedef struct                                  
{                                               
    BYTE        SRB_Cmd;                        
    BYTE        SRB_Status;                    
    BYTE        SRB_HaId;                      
    BYTE        SRB_Flags;                      
    DWORD       SRB_Hdr_Rsvd;                   
    BYTE        HA_Count;                       
    BYTE        HA_SCSI_ID;                     
    BYTE        HA_ManagerId[16];               // 0A/010 String describing the manager
    BYTE        HA_Identifier[16];              // 1A/026 String describing the host adapter
    BYTE        HA_Unique[16];                  // 2A/042 Host Adapter Unique parameters
    WORD        HA_Rsvd1;                       
}
SRB_HAInquiry;


mmmmm BYTE zie ik nu staan.... Zou dat een deel verklaren waarom ik geen 16 bytes krijg maar slechts 4?
Ik heb nog even gekeken op school. Daar krijg ik de volgende waardes:
1230000961 = 49 50 53 41 = IPSA = ASPI;
1129142611 = 43 4D 59 53 = CMYS = symc;
Volgens mij gaat het de goede kant op.

Exploring the world by bicycle! cyclingsilk.wordpress.com


  • El Psycho
  • Registratie: September 2002
  • Laatst online: 13-05 13:40
IJnte schreef op 15 september 2004 @ 09:26:
C++:
1
2
3
    BYTE        HA_ManagerId[16];               // 0A/010 String describing the manager
    BYTE        HA_Identifier[16];              // 1A/026 String describing the host adapter
    BYTE        HA_Unique[16];                  // 2A/042 Host Adapter Unique parameters
Deze regels betekenen dat HA_ManagerId, HA_Identifier en HA_Unique elk arrays zijn met 16 elementen van het type byte. Dus inderdaad een string van 15 characters (plus de trailing '\0')

De fout zit em volgens mij in de type casts die jij later doet:
IJnte schreef op 15 september 2004 @ 09:26:
C++:
1
2
3
4
5
6
  dwManagerID = *(DWORD *)(srbHAInquiry.HA_ManagerId);
  ShowMessage(dwManagerID);        // Laat manager ID zien
  dwIdentifier = *(DWORD *)(srbHAInquiry.HA_Identifier);
  ShowMessage(dwIdentifier);       //Laat Identifier zien
  dwUnique = *(DWORD *)(srbHAInquiry.HA_Unique);
  ShowMessage(dwUnique);          //Laat Unique zien
Jij cast die pointer naar een character array namelijk naar een pointer naar een word (is 4 bytes) en die dereferentieer je dan en sla je op in dwManagerID, dwIdentifier en dwUnique welke te oordelen naar de naam ook echt words zijn.

De oplossing zou dan makkelijk zijn:
C++:
1
2
3
4
5
6
7
8
9
10
  char *strManagerID; // String describing the manager
  char *strIdentifier;  // String describing the host adapter
  char *strUnique;  // Host Adapter Unique parameters

  strManagerID = (char*)(srbHAInquiry.HA_ManagerId);
  ShowMessage(strManagerID);        // Laat manager ID zien
  strIdentifier = (char*)(srbHAInquiry.HA_Identifier);
  ShowMessage(strIdentifier);       //Laat Identifier zien
  strUnique = (char*)(srbHAInquiry.HA_Unique);
  ShowMessage(strUnique);          //Laat Unique zien


En dan lijkt me zelfs nog de (char*) cast die ik bij elke regel zet overbodig, maar ja, better safe than sorry in dit geval

  • IJnte
  • Registratie: Juni 2003
  • Laatst online: 19-05 12:01
_/-\o_ _/-\o_ Het werkt! Erg bedankt. Ik kan weer verder >:) . Hij geeft netjes aan welke controller erin zit, en dat het "Aspi for WIN32" is! Dit is precies wat ik had verwacht dat terug had moeten komen. :*)

Exploring the world by bicycle! cyclingsilk.wordpress.com

Pagina: 1