Laden...

fixed in C#? (oder: welcher data type ist '32-bit signed fixed-point number (16.16)' ?

Erstellt von e2020 vor 10 Jahren Letzter Beitrag vor 10 Jahren 3.620 Views
E
e2020 Themenstarter:in
40 Beiträge seit 2011
vor 10 Jahren
fixed in C#? (oder: welcher data type ist '32-bit signed fixed-point number (16.16)' ?

hallo helfende(r) engel 🙂 ,

ich versuche gerade eine font-datei (.ttf) zu parsen,
und sitze deswegen über den open true type spezifikationen von microsoft (und von apple)
und in head - Font Header werden grössen-angaben in Fixed - 32-bit signed fixed-point number (16.16) erwartet...

ULONG : 32-bit unsigned integer
LONG : 32-bit signed integer
etc sind mir bekannt, aber:
wie gross ist 'fword' und/oder
++Fixed : 32-bit signed fixed-point number (16.16) ++(= Int32 ??)

  • "(16.16)" scheint zu bedeuten dass die ersten 16 bit für eine major-versionsnummer stehen und die 2.ten 16 bit für eine minor - also zählte ich beides zu einer int32 zusammen - aber mit dieser grösse funktioniert der code nicht (werden falsche werte geparst / bzw werden werte von falschen stellen aus der .ttf gelesen)...
  • es kann doch nicht etwa kein fixed-POINT gemeint sein, oder?
  • also wenn es int32 nicht ist, wie gross ist denn nun eine 'Fixed 32-bit signed fixed-point number (16.16)' für/in c# ?

zu 'fword' hat etwas mit 6 byte zu tun - das ist alles, was mir die vs c# express hilfe dazu sagen kann - findet ihr mehr?

danke für eure hilfe!
oliver

16.830 Beiträge seit 2008
vor 10 Jahren

Wenns um FWORD geht so steht doch in Deinem Link, dass es sich um den Typ short, also Int16 handelt.
Und das passende für Fixed dürfte Decimal sein. Aber 16.16 kann man ja auch konvertieren:


var foo = ( ( fixed >> 16 ) + ( fixed & 0xffff ) / 65536.0 );

wenn mich ned alles täuscht.

E
e2020 Themenstarter:in
40 Beiträge seit 2011
vor 10 Jahren

danke! für die antwort...

Wenns um FWORD geht so steht doch in Deinem Link, dass es sich um den Typ short, also Int16 handelt.

wo bitte steht das? (wie konnte ich das nur übersehen haben...)

**decimal **scheint aber nicht zu stimmen...
mein code ist bereits fertig und stimmt (hoffentlich), die ergebnisse sind mir auch bereits bekannt - es muss nur noch an EINER stelle diese 'fixed zahl' eingetragen werden (um auf die bereits bekannten ergebnisse zu kommen) - aber wenn ich dort 'decimal' angebe bekomme ich immer noch falsche ergebnisse...
(ich hoffe das war klar genug ausgedrückt :tongue🙂
es müsste eine andere einheit sein...

16.830 Beiträge seit 2008
vor 10 Jahren

FWORD 16-bit signed integer (SHORT) that describes a quantity in FUnits.

Und in .NET steckt hintert short einfach ein Int16.

Wenns Fixed32 ist, dann passt Decimal nicht (ich hab die Spezifikation jetzt nicht durchgelesen). Google mal nach Fixed32, ob Du dort was passendes findest.

E
e2020 Themenstarter:in
40 Beiträge seit 2011
vor 10 Jahren

(zögerndes) hmm, danke, aber 'fixed32' bringt mich jetzt auch nicht wirklich weiter...
mit decimal hattest du aber eigentlich recht, ich weiss bloss nicht wie ich es in meinem fall anwenden soll:

ich erstelle wie z.B. aus dieser seite: HEAD

Fixed          Table version         number 0x00010000 for version 1.0. 
Fixed          fontRevision          Set by font manufacturer. 
ULONG          checkSumAdjustment     To compute: set it to 0, sum the entire font as ULONG, then store 0xB1B0AFBA - sum. 
ULONG          magicNumber           Set to 0x5F0F3CF5. 
USHORT         flags                   Bit 0: Baseline for font at y=0;
                                       Bit 1: Left sidebearing point at x=0;
etc 

STRUCTs für die header,

    struct TT_HEAD_TABLE_HEADER__struct  
    {  
        public **[datatype???]** a_tableVersion__uint32; // Festkommazahl (fixed point) ???  
        public **[datatype???]** b_fontRevision__uint32; // Festkommazahl (fixed point) ???  
        public ulong c_checkSumAdjustment__ulong; //   
        public ulong d_magicNumber__ulong; //  
        public ushort e_flags__ushort;  
        public ushort f_unitsPerEm__ushort;  
        public Int64 g_date_created__int64 ; // LONGDATETIME created  

etc

aber es passt immer noch nichts- auch kein decimal - hat noch jemand eine idee?
danke,
oliver

4.221 Beiträge seit 2005
vor 10 Jahren

Ev. findest Du hier noch Code:

http://fontforge.org/

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo e2020,

in der Spezifikation steht:

Fixed 32-bit signed fixed-point number (16.16)

Insofern ist schon mal klar, dass für die Struktur-Definition wohl nur ein Int32 bzw. Alternativ zwei Int16 in Frage kommen.

Wie man dann diese 32Bits interpretiert, steht auf einem anderen Blatt. Ich habe die Bezeichnung "fixed-point number (16.16)" noch nicht gehört, würde aber vermuten, dass dies bedeutet, dass der Vorkommaanteil aus 16bit und der Nachkommaanteil auf (weiteren) 16bit besteht. Die 16bit vor dem Komma werden ganz einfach eine Int16-Ganzzahl sein. Also die Wertigkeiten 20 bis 214 (bzw. 215). Die 16bit nach dem Komma werden wohl die Wertigkeiten 2-1 bis 2^-16 haben, also 0.5, 0.25, 0.125 usw. Dafür gibt es aber keinen nativen Datentyp in C#. Deshalb müsste man eben auf einen zweiten Int16 ausweichen und die Bits dann selber interpretieren.

herbivore

E
e2020 Themenstarter:in
40 Beiträge seit 2011
vor 10 Jahren

hallo 🙂 und danke für eure antworten!

@programmierhans
danke für den tip, aber den code bin ich bereits durch - das ist c++, die schreiben dort auch nur 'fixed' - und das ist/war ja gerade meine frage...

@herbivore "Alternativ zwei Int16 in Frage kommen"
ja, genau, danke, in diesem fall sollte passen:
zwei USHORT 16-bit unsigned integer.
mal sehen ob's jetzt geht...

@ProGamer
ähm, soweit wie ich es verstanden habe (und ich bin heute schon etwas 'betriebsblind') scheint es in c# keinen datentyp für 'festkommazahl' (fixed point) zu geben - das einzige uns dafür zur verfügung stehende instrument ist wohl 'decimal' - dein link wäre für 'float' - aber in meinem fall geht's dann doch noch um etwas anderes und zwar wie aus zwei 16 bit (zahlen) EINE versionsnummer (mit festkomma, und zwar in der mitte, deshalb auch der name "16,16" ) entsteht, d.h. die zahl vor und nach dem komma entstehen jweils aus 16 bit ...

so, jetzt muss ich das erstmal ausprobieren 👅
danke!
oliver

P
660 Beiträge seit 2008
vor 10 Jahren

Hallo,

bestimmt hattest du das hier schon gefunden, aber vllt hilft es dir ja mit den neuen erkenntnissen weiter: How to convert packed integer (16.16) fixed-point to float

was es jetzt hiermit auf sich hat würde mich auch mal interessieren, nur leider kann ich mir ebenfalls keine reim drauf machen -.-

MfG
ProGamer*Der Sinn Des Lebens Ist Es, Den Sinn Des Lebens Zu Finden! *"Wenn Unrecht zu Recht wird dann wird Widerstand zur Pflicht." *"Ignorance simplifies ANY problem." *"Stoppt die Piraterie der Musikindustrie"

5.658 Beiträge seit 2006
vor 10 Jahren

Hi e2020,

wenn ich es richtig verstehe, geht es bei dir lediglich um die Darstellung der Versions-Nummern. Dazu steht in den Docs (http://www.microsoft.com/typography/otspec/otff.htm):

When a Fixed number is used as a version, the upper 16 bits comprise a major version number, and the lower 16 bits a minor.

Das entspricht auch der Darstellung, die du oben gepostet hast:

Fixed | Table version number | 0x00010000 for version 1.0

Ich sehe da wirklich kein Problem. Aber vielleicht sollstest du mal konkrete Werte posten, damit man die bisher gemachten Überlegungen auch verifizieren kann.

Christian

Weeks of programming can save you hours of planning