# [ASF] Kein FilePropertiesObject?!



## Tobse (4. Okt 2011)

Hey Leute,
ich bin gerade dabei einen Reader für ASF Dateien zu schreiben. Dabei richte ich mich nach der Spezifikation von MS (zu finden hier: Download Details - Microsoft Download Center - ASF Specification).
Das ganze mache ich, um aus .wma Dateien die Musikinformationen herauszufiltern. Da WMA auf ASF basiert sollte das ja kein problem sein.

In dieser Spezifikation ist nun von Header-Objekten die rede. Diese "Objekte" (nicht die, wie man sie von Java her kennt!) beginnen ALLE mit einem Int128 der ihre GUID wiederspeigelt. In der Spezifikation steht auch, dass in jeder ASF-Datei diese 3 objekte eingebaut sind:
-File Properties Objekt
-Header Extensions Objekt
-Stream Properties Objekt
in belibiger reihenfoleg.
Die GUID des File Properties Objekts sollte laut MS [c]ASF_File_Properties_Object[/c] sein, dieser String geht aber über das erreichbare von 16 bytes hinaus.
Ich habe also mal alle GUIDs von allen Header-Objekten aus meiner Beispiel WMA ausgelesen. Aber egal, welches Objekt ich als [c]File Properties Objekt[/c] behandle, das [c]FileSize Field[/c] (das laust MS die größe der gesamten datei enthält) ist nichtmal annähernd an der tatsächlichen Dateigröße dran (4.98 MB).

Diese GUIDs sind in der WMA drin (übrigens auch in 2 anderen, die ich getestet habe):

```
489602
525563
392743
165129
405255
317551
378757
neu:
450754
560005
342805
18 446 744 073 709 547 655
```

Bie [c]525536[/c] und [c]392743[/c] ist das [c]FileSize Field[/c] in der gleichen stellenlänge wie die Dateigröße aus File.length();, aber nichtmal nahe dran.

Hier noch, wie ich die Int128 (und die anderen Zahlen) auslese:

```
// Laut MS handelt es sich hierbei IMMER um little-endian und unsigned werte.
public static long read(int bits, int[] in) throws NumberFormatException {
		if ((int) Math.floor(bits/8)!=bits/8) throw new NumberFormatException("Bitnumber must be a multiple of 8.");
		long i=0;
		for (int n=bits/8-1;n>0;n--) {
			i+=in[n]*(256^n);
		}
		return i+in[0];
	}
	
	public static int readInt16(InputStream in) throws IOException {
		int[] ar=new int[2];
		ar[0]=in.read();
		ar[1]=in.read();
		return (int) read(16, ar);
	}
	public static long readInt32(InputStream in) throws IOException  {
		return (
			readInt16(in)+
			readInt16(in)*256
		);
	}
	public static long readInt64(InputStream in) throws IOException  {
		return (
			readInt32(in)+
			readInt32(in)*256
		);
	}
	public static long readInt128(InputStream in) throws IOException  {
	    long i=0;
		for (int n=15;n>0;n--) {
			i+=in.read()*(256^n);
		}
		return i+in.read();
	}
```

Hat da jemand eine Idee was ich (oder MS) falsch mache? Wäre eine RIESEN hilfe! Danke im vorraus an alle die sich gedanken machen .

EDIT: Ich hab mit dem Windows Media Player mal ne CD gerript. Im HEX-Editor sehen diese Dateien mal gaaanz anders aus  Aber immernoch finde ich das [c]FilePropertiesObject[/c] nicht. Es sind nochmal neue GUIDs dazugekommen, s.o.


----------



## musiKk (4. Okt 2011)

Tobse hat gesagt.:


> Dabei richte ich mich nach der Spezifikation von MS (zu finden hier: Download Details - Microsoft Download Center - ASF Specification).



Hui, mal eine MS Spec, die nicht als .doc vorliegt.



> Die GUID des File Properties Objekts sollte laut MS [c]ASF_File_Properties_Object[/c] sein, dieser String geht aber über das erreichbare von 16 bytes hinaus.



Ich habe jetzt nicht alles verfolgt, aber vielleicht ist das ja schon ein Problem, welches weitere nach sich zieht. Die GUIDs sind in Abschnitt 10 zu finden. Die GUID für [c]ASF_File_Properties_Object[/c] im Speziellen ist in 10.2. Die GUIDs sind dort hexadezimal dargestellt und entsprechend genau 16 Bytes lang.


----------



## Tobse (4. Okt 2011)

Ohje, danke. Das erklärt schonmal einiges . Die Sache mit der bestimmung des Objektes wäre geklärt. Allerdings ist in der WMA-Datei vom Windows Media Player irgendwelche GUIDs, die nicht in der Spezifikation aufgeführt sind... Na das kann ja ein Spaß werden...

EDIT: Ahja, bei genauerem hinsehen war ein FilePropertiesObject mit der GUID aus der Spezifikation auch nicht aufzufinden... M$


----------

