Hexadecimaal naar int

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Mlchel
  • Registratie: Oktober 2011
  • Laatst online: 23-05-2024
Hallo Tweakers,

Ik ben bezig om een matlab programma om te schrijven naar python maar liep tegen het volgende probleem aan:

In matlab gebruik ik:
code:
1
 versie = fread(fid,1,'int16')

Hier wijst fid naar de file, 1 het aantal elementen en int16 naar het formaat.
Wat als resultaat een integer heeft.

Nu gebruik ik in Python:
code:
1
versie = file.read(1)

Dit geeft als resultaat:
code:
1
\xaa

Hoe vertaal ik deze string nu naar een integer?
code:
1
int(aa,16)
geeft het resultaat, maar tot nu toe lukt het me niet om de \x er af te slopen.

Iemand een idee?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Laatst online: 03:14

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

:? \xaa is toch gewoon een representatie van een bepaalde waarde? Weet je zeker dat je überhaupt iets moet converteren?

Ik ben niet bekend met MatLab, maar een .read(1) lijkt mij te duiden op "lees 1 byte" (of, als ik de eerdere code goed begrijp, lees 1 record van 16 bits); dat die byte toevallig 0xaa16 bevat, ofwel 17010 en wordt weergegeven in hex vorm boeit toch niet?

[ Voor 39% gewijzigd door RobIII op 21-03-2012 16:54 ]

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


Acties:
  • 0 Henk 'm!

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Klinkt alsof je gewoon ord(versie) moet doen inderdaad.

All my posts are provided as-is. They come with NO WARRANTY at all.


Acties:
  • 0 Henk 'm!

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

Sh4wn

Bio-informatica

Bij Matlab kan je inderdaad al het type waarde geven wat je inleest, bij Python is dit altijd een string (byte-reeks in Python 3). Met de functie ord kan je er inderdaad een integer van maken.

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 22:12
In Python 3 zijn bytes inderdaad al integers, dus het zal wel om Python 2 gaan.

Voor een enkele byte werkt ord() inderdaad, maar voor complexere typen is de struct-module handig.

De TS lijkt 16-bits integers te willen lezen. Ik vermoedt dat 'ie zoiets wil:
Python:
1
versie, = struct.unpack('>h', file.read(2))

Acties:
  • 0 Henk 'm!

  • Mlchel
  • Registratie: Oktober 2011
  • Laatst online: 23-05-2024
CyBeR schreef op woensdag 21 maart 2012 @ 16:52:
Klinkt alsof je gewoon ord(versie) moet doen inderdaad.
Dat was het inderdaad :) .
Dank u!

Acties:
  • 0 Henk 'm!

  • Mlchel
  • Registratie: Oktober 2011
  • Laatst online: 23-05-2024
Heb een nieuwe vraag :)

code:
1
2
3
 ofile = open(filename)
str = ofile.read(31)
str2 = ofile.read(1)

Zou toch hetzelfde resultaat moeten hebben voor str2 als:
code:
1
2
3
ofile = open(filename)
filename.seek(31,-1)
str2 = ofile.read(1)



Verder nog een matlabvraag:
code:
1
fread(fid, 10, 'int16')

Leest deze dan de eerst volgende 20 bytes van de file?

Acties:
  • 0 Henk 'm!

  • Glorificationer426
  • Registratie: November 2001
  • Laatst online: 13-05 16:39

Glorificationer426

come we hero rush yes?

In de tijd dat je de vraag hier gepost hebt, had je het ook gewoon kunnen testen toch? Een klein beetje inzet is wel gewenst hier ;)

(@DiscWout) omg
(@DiscWout) bijna over mn nek :D
(@DiscWout) echt zo een boer laten, hele mond vol kots :D


Acties:
  • 0 Henk 'm!

  • Mlchel
  • Registratie: Oktober 2011
  • Laatst online: 23-05-2024
Glorificationer426 schreef op donderdag 22 maart 2012 @ 15:13:
In de tijd dat je de vraag hier gepost hebt, had je het ook gewoon kunnen testen toch? Een klein beetje inzet is wel gewenst hier ;)
Heb het getest, maar het geeft niet hetzelfde resultaat ;) . Doelde meer of iemand weet waarom dit niet hetzelfde resultaat geeft :P.


Edit:
code:
1
file.seek(0); file.read(1)

geeft niet hetzelfde resultaat als
code:
1
file = open(location); file.read(1)


Op diverse sites wordt er gesproken dat file.seek(0) hetzelfde resultaat geeft als rewind() (python kent geen rewind, dus daarom open ik de file opnieuw), maar dit blijkt dus niet het geval te zijn.

[ Voor 30% gewijzigd door Mlchel op 22-03-2012 15:50 ]


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 22:12
Voor zover ik weet is dat wel hetzelfde. Ik denk dat je iets anders fout doet; misschien moet je je bestand in binary mode openen (open(pad, "rb")) als je op Windows werkt.

Wat betreft je eerdere code: -1 is geen geldige waarde voor de tweede parameter van seek().

[ Voor 22% gewijzigd door Soultaker op 22-03-2012 20:14 ]


Acties:
  • 0 Henk 'm!

  • Mlchel
  • Registratie: Oktober 2011
  • Laatst online: 23-05-2024
Dank je Soultaker :). Het ziet er al een stuk beter uit nu.

Loop nu wel tegen een nieuw probleem aan:
Byte offset: 114
Data type/size in bytes: 2 (signed int)
Description: Sample Frequency

Hiervoor vind ik:
'\x00\x08'
Heb al gezocht naar signed integers, maar kan weinig vinden over deze notatie.
Is het mogelijk dat hier 2048 staat?

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 22:12
0x0800 = 8×256 = 2048, dus inderdaad.

Ik suggereerde eerder al om struct.unpack() te gebruiken voor het decoderen van dit soort data.

Acties:
  • 0 Henk 'm!

  • Mlchel
  • Registratie: Oktober 2011
  • Laatst online: 23-05-2024
Soultaker schreef op vrijdag 23 maart 2012 @ 14:09:
0x0800 = 8×256 = 2048, dus inderdaad.

Ik suggereerde eerder al om struct.unpack() te gebruiken voor het decoderen van dit soort data.
Ben er uit nu! :) Inderdaad met de struct.unpack('h',...)
Dank voor de hulp!
Pagina: 1