Seriennummer unter Linux und C++ ausgeben

Dies ist das deutsche Forum für alle Themen um den IO-Warrior. Beiträge bitte nur in Deutsch.

Moderator: Guido Körber

Post Reply
hiasl
Posts: 26
Joined: Tue Jul 25, 2006 9:58 am

Seriennummer unter Linux und C++ ausgeben

Post by hiasl »

Hallo,

folgender Codeschnippsel funktioniert unter Visual C++ einwandfrei, jedoch nicht unter Linux:

wchar_t serial[9];
IowKitGetSerialNumber(lsDevs, serial);
sprintf(id, "%ls", serial);
fprintf(stderr, "iowarrior with serial %s found\n", id);

Als Ergebnis erhalte ich immer Müll.

Zur Erklärung für wchar_t : dieser Typ ist sowohl unter Visual C++ als auch gcc verfügbar. Deshalb verwende ich es anstatt unsigned short.

Hat jemand ein Codebeispiel in C++, das unter Linux läuft?

Danke,
Matthias
Robert Marquardt
Posts: 543
Joined: Mon Dec 01, 2003 6:09 pm

Post by Robert Marquardt »

Schau ich mir mal morgen an.
wayoda
Posts: 362
Joined: Fri Dec 19, 2003 12:00 pm
Location: Wuppertal/Germany

Re: Seriennummer unter Linux und C++ ausgeben

Post by wayoda »

Hallo hiasl,
hiasl wrote: Zur Erklärung für wchar_t : dieser Typ ist sowohl unter Visual C++ als auch gcc verfügbar.
Unter Linux (GNU) ist wchar_t 32 bit breit. Für Windows weiß ich es nicht schätze aber dort sind es nur 16 bit.
Deshalb verwende ich es anstatt unsigned short.
Geht in diesem Fall leider nicht
Hat jemand ein Codebeispiel in C++, das unter Linux läuft?
Das folgende ist aus der Datei
LinuxSDK/libiowkit-1.5.0/tests/iowkittest.c
(Hier sind fast alle wichtigen Funktionen einmal vorgeführt)

Code: Select all

unsigned short sn[9];
char snt[9];

iows[i] = IowKitGetDeviceHandle(i + 1);
// Get serial number
IowKitGetSerialNumber(iows[i], sn);
pid = IowKitGetProductId(iows[i]);
for (j = 0; j < 9; j++)
  snt[j] = sn[j];
printf("%d PID %x, S/N "%s"\n", i + 1, (unsigned int) pid, snt);
Das ist natürlich viel zu kompliziert, aber leider nicht zu umgehen.
Am besten würde die IowkIt-Lib intern die Serienummer direkt in einen
unsigned 32bit Wert umwandeln. Aber irgendwer hat sich das mal vor langer Zeit so ausgedacht :-(

Eberhard
Robert Marquardt
Posts: 543
Joined: Mon Dec 01, 2003 6:09 pm

Post by Robert Marquardt »

Ich wars nicht. Das naechste API wird die Seriennummer deshalb in allen Varianten anbieten. ASCI string, Unicode string und Zahl.
Das Problem scheint aber geloest, daher mache ich heute keine Experimente mehr.

Ich habe mich gefragt warum wchar_t 32 Bit ist, aber dann habe ich eben auf linux-usb-devel eine Message dazu gelesen. wchar_ soll einen Unicode Character aufnehmen koennen und die koennen nun mal mehr als 16 Bit haben. USB nutzt wohl nur UCS-2 und setzt daher 16 Bit Chars voraus.

Unicode ist sehr verwinkelt und viele Implementierungen sind buggy. Nicht zuletzt haben die meisten Programmierer (einschliesslich mir) nur oberflaechliches Wissen zu Unicode.
Last edited by Robert Marquardt on Thu Jun 07, 2007 10:13 am, edited 1 time in total.
hiasl
Posts: 26
Joined: Tue Jul 25, 2006 9:58 am

Post by hiasl »

Vielen Dank für den Code Eberhard. Hauptsache er funktioniert unter beiden Betriebssystemen. Danach kommt eh der Deckel drauf und ich schau nie wieder rein ;)

Gruß
Matthias
Post Reply