je devais le faire il y a quelques années pour un projet de travail. Je ne peux pas le publier car il est propriétaire, mais la spécification pour les polices TT est here.
J'ai écrit des classes pour la table de décalage, l'enregistrement de nom, l'en-tête de table de nom et les éléments de répertoire de table de sorte que chaque classe ait une méthode FromStream statique.
J'ai aussi écrit une classe utilitaire appelé BigEndianReader pour traiter les données de lecture à partir d'un grand flux ordonné endian, que je suis heureux de mettre ici pour vous rendre la vie plus facile:
public class BigEndianReader
{
public static bool Read(Stream stm, out uint i)
{
int bhihi = stm.ReadByte();
if (bhihi == -1)
{
i = 0;
return false;
}
int bhi = stm.ReadByte();
if (bhi == -1)
{
i = 0;
return false;
}
int blo = stm.ReadByte();
if (blo == -1)
{
i = 0;
return false;
}
int blolo = stm.ReadByte();
if (blolo == -1)
{
i = 0;
return false;
}
i = (uint)((bhihi << 24) | (bhi << 16) | (blo << 8) | blolo);
return true;
}
public static bool Read(Stream stm, out int i)
{
int bhihi = stm.ReadByte();
if (bhihi == -1)
{
i = 0;
return false;
}
int bhi = stm.ReadByte();
if (bhi == -1)
{
i = 0;
return false;
}
int blo = stm.ReadByte();
if (blo == -1)
{
i = 0;
return false;
}
int blolo = stm.ReadByte();
if (blolo == -1)
{
i = 0;
return false;
}
i = ((bhihi << 24) | (bhi << 16) | (blo << 8) | blolo);
return true;
}
public static bool Read(Stream stm, out ushort s)
{
int bhi = stm.ReadByte();
if (bhi == -1)
{
s = 0;
return false;
}
int blo = stm.ReadByte();
if (blo == -1)
{
s = 0;
return false;
}
s = (ushort)(((bhi << 8) | blo) & 0xffff);
return true;
}
public static bool Read(Stream stm, out short s)
{
int bhi = stm.ReadByte();
if (bhi == -1)
{
s = 0;
return false;
}
int blo = stm.ReadByte();
if (blo == -1)
{
s = 0;
return false;
}
s = (short)(((bhi << 8) | blo) & 0xffff);
return true;
}
}
Ce n'est pas particulièrement élégant , mais il est assez facile à utiliser:
int val;
if (!BigEndianReader.Read(stm, out val))
throw new SomeErrorOfSomeKind();
J'imagine que si vous avez pris soin assez que vous pouvez faire ce toutes les méthodes d'extension sur le volet et votre pourrait lirait:
int val;
if(!stm.BERead(out val)) // BE prefix for Big Endian
throw new SomeErrorOfSomeKind();
merci socle il me donne un point de départ – beakersoft