Hoe met PHP op bit-niveau bestand lezen, bewerken en bewaren

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Mijn vraag

[ Voor 96% gewijzigd door Verwijderd op 01-07-2020 08:00 ]

Alle reacties


Acties:
  • 0 Henk 'm!

  • DataGhost
  • Registratie: Augustus 2003
  • Laatst online: 12:19

DataGhost

iPL dev

In PHP kan je net als in de meeste andere talen gewoon werken op bit-niveau. Afhankelijk van hoe je het inleest kan je "forceren" dat het in PHP als numeriek type gebruikt wordt (dmv o.a. ord() maar er zijn ook andere manieren). Als het volgens var_dump() een int is, zit je op de goede weg. Daarna kan je met de bitwise operators uit de voeten om de bytes te padden op de manier dat je wilt, en ze daarna weer wegschrijven (evt dmv o.a. chr() maar er zijn ook andere manieren).

[ Voor 6% gewijzigd door DataGhost op 10-06-2020 15:40 ]


Acties:
  • 0 Henk 'm!

  • jeroen3
  • Registratie: Mei 2010
  • Laatst online: 10:00
Verwijderd schreef op woensdag 10 juni 2020 @ 15:35:
Stel ik lees dus 3 bytes uit, in hex notatie: AB56FD, dan wil ik dit als 4 bytes wegschrijven, bijvoorbeeld AB506FD0 (ik neem aan dat de nullien achteraan moeten (minst significante bits).
Wat is de endian in je binary file?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dat is nog een raadsel. Ik moet dus mogelijk 2 varianten proberen.

Acties:
  • 0 Henk 'm!

  • jeroen3
  • Registratie: Mei 2010
  • Laatst online: 10:00
Heb je te trouwens te maken met bit-packing?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
nee, geen bit packing.

Acties:
  • 0 Henk 'm!

  • jeroen3
  • Registratie: Mei 2010
  • Laatst online: 10:00
Dan vind ik je vraag een beetje gek, of ik begrijp het niet goed.
Want als ik 12 bits wegschrijf komt dat minimaal uit een int16 en dan worden er dus twee bytes geschreven.
3 bytes lezen is dus anderhalve sample. Met bit-packing zijn het er 2.

Is je file soms een base16 gecodeerd?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
De data is echt 12 bits, dus 1,5 byte per sample.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik begin nu een beetje een vermoeden te krijgen dat de bits achter elkaar zitten, dus eerst de 350000 minst significante bits, dan de bits die voor 2 staan, dan die voor 4 etc. Of precies omgekeer. De data in het eerste 1/3 deel ziet er heel anders uit dan in het tweede 2/3 deel.

Acties:
  • +1 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op woensdag 10 juni 2020 @ 16:44:
Ik begin nu een beetje een vermoeden te krijgen dat de bits achter elkaar zitten, dus eerst de 350000 minst significante bits, dan de bits die voor 2 staan, dan die voor 4 etc. Of precies omgekeer. De data in het eerste 1/3 deel ziet er heel anders uit dan in het tweede 2/3 deel.
Da zou 't domste file format ever zijn. No way.

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!

  • PageFault
  • Registratie: April 2002
  • Laatst online: 10-09 19:15
Verwijderd schreef op woensdag 10 juni 2020 @ 15:35:
Mijn vraag
Ik heb een bestand met ongeveer 350000 elementen (sensor-samples) van 12-bit (12 bit WORDS). De nabewerking is echter alleen geschikt voor 16-bit data.
Stel ik lees dus 3 bytes uit, in hex notatie: AB56FD, dan wil ik dit als 4 bytes wegschrijven, bijvoorbeeld AB506FD0 (ik neem aan dat de nullien achteraan moeten (minst significante bits).


Relevante software en hardware die ik gebruik
MAMP

Ik heb geen idee hoe bit-operaties te doen in PHP, met name omdat ik merk dat variabelen in PHP altijd multi-mode zijn: getallen kun je als string gebruiken etc. Waarschijnlijk is het met een paar regels op te lossen.
Hoe kan 12 bits data resulteren is 3 bytes? En als je dat opslaat als 4 bytes, wordt het 32 bits ipv 16. Zitten er in die 3 bytes niet gewoon 2 sample waardes?

Acties:
  • 0 Henk 'm!

  • DataGhost
  • Registratie: Augustus 2003
  • Laatst online: 12:19

DataGhost

iPL dev

PageFault schreef op woensdag 10 juni 2020 @ 17:16:
[...]


Hoe kan 12 bits data resulteren is 3 bytes? En als je dat opslaat als 4 bytes, wordt het 32 bits ipv 16. Zitten er in die 3 bytes niet gewoon 2 sample waardes?
Dat is wel wat ik eruit haal, aangezien hij zijn padding laat zien als xxx0xxx0 ipv xxxxxx00.

Acties:
  • 0 Henk 'm!

  • Josk79
  • Registratie: September 2013
  • Laatst online: 05:25
Met <<, >> en & kom je een heel eind.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php

//Stel je hebt een byte array
$raw=[0xAB, 0x56, 0xFD];

//Dan per 3 bytes uitlezen in een loop
for($idx=0;$idx<count($raw);$idx+=3) {
  //en schuiven met bits met << of >>
  //of gebruik maken van logical AND: &
  $v1 = ($raw[$idx] << 4) + ( $raw[$idx+1] >> 4);
  $v2 = (($raw[$idx+1] & 0xF) << 8) + $raw[$idx+2];
  
  //resultaat, in hex voor de duidelijkheid
  echo dechex($v1) . "  " . dechex($v2) . "\n";
}


Output:
ab5  6fd


Mogelijk moet je het nog wat aanpassen i.v.m. de daadwerkelijke bitvolgorde.

[ Voor 65% gewijzigd door RobIII op 10-06-2020 17:58 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
offtopic:
Post code gewoon even in je reply m.b.v. code tags i.p.v. op een externe site a.u.b. Dan hebben mensen die over 5 jaar op dit topic stuiten er ook nog iets aan als 3v4l.org besluit er mee op te houden in 2021.

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!

  • Josk79
  • Registratie: September 2013
  • Laatst online: 05:25
...gaat niet lekker met mijn mobiel met brakke copy/paste...

Thanks, @RobIII !

[ Voor 16% gewijzigd door Josk79 op 10-06-2020 18:03 ]


Acties:
  • 0 Henk 'm!

  • Josk79
  • Registratie: September 2013
  • Laatst online: 05:25
Gelukt, @Verwijderd ?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Nog niet, dit weekend weer een poging wagen...

Acties:
  • 0 Henk 'm!

  • Josk79
  • Registratie: September 2013
  • Laatst online: 05:25
Het is het makkelijkst als je de bytes en de bijbehorende sensorwaardes erbij hebt, dan is terug te rekenen in welke volgorde de bits moeten. Mogelijk moet er nog geschaald worden, bijv 0x0 t/m 0xfff komt overeen met 0 t/m 100 procent.

Ook is mogelijk een patroon te zien als je de bytewaarden van meerdere samples achter elkaar vergelijkt.

Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 17-09 09:36
DataGhost schreef op woensdag 10 juni 2020 @ 17:25:
[...]

Dat is wel wat ik eruit haal, aangezien hij zijn padding laat zien als xxx0xxx0 ipv xxxxxx00.
Gaat het om alleen numerieke data?
Dan hebben ze waarschijnlijk 4-bits per cijfer gebruikt, bekend als BCD-code.

Acties:
  • 0 Henk 'm!

  • Josk79
  • Registratie: September 2013
  • Laatst online: 05:25
...als AB56FD werkelijke dat is is dat uitgesloten. Maar inderdaad, als je in hex notatie alleen cijfers ziet kan het zo zijn.

Acties:
  • 0 Henk 'm!

  • Sissors
  • Registratie: Mei 2005
  • Niet online
Als het inderdaad alleen cijfers zijn en als het echt iets uit het jaar nul is. BCD notatie is wel redelijk dood ondertussen voor iets als een sensor uitlezen.

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Ik denk dat het JGMW formaat is.

Dat is een exotisch formaat wat in dit soort topics opvallend populair is. Ik snap zelf de drang voor Jullie Gokken Maar Wat niet, stel dan inhoudelijke vragen aan de ts. Wat voor device of sensor is het? Heb je echte data of specs? Etc etc.

{signature}


Acties:
  • +1 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Verwijderd schreef op woensdag 10 juni 2020 @ 15:35:
Ik heb geen idee hoe bit-operaties te doen in PHP, met name omdat ik merk dat variabelen in PHP altijd multi-mode zijn: getallen kun je als string gebruiken etc.
Dit is niet helemaal gerelateerd aan je probleem zelf, maar even voor de duidelijkheid: als jij eenmaal een integer of float hebt dan zal ook PHP het niet zomaar omzetten naar een string tenzij je zelf iets doet om er weer een string van te maken. Zolang je zelf geen string-bewerkingen op zo'n getal doet en je het getal ook niet in een functie stopt die dat wél wil doen zal zo'n variabele niet ineens van type veranderen.

Overigens kun je in recente versies van PHP ook aan alle kanten type hinten. Als je gewoon aangeeft in de function signature dat je verwacht dat je variabele een integer is dan krijg je een error als je er alsnog een string aan voert.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1