/// <summary> /// Given the first few bytes of content, decide what the FileCategory /// should be, based on what's in the Content.<br/> /// This should be called before deciding how to set the content. /// </summary> /// <param name="firstBytes">At least the first four bytes of the file read in binary form - can be longer if you wish</param> /// <returns>The type that should be used to store this file.</returns> public static FileCategory IdentifyCategory(byte[] firstBytes) { var firstFour = new Byte[4]; int atMostFour = Math.Min(4, firstBytes.Length); Array.Copy(firstBytes, 0, firstFour, 0, atMostFour); var returnCat = (atMostFour < 4) ? FileCategory.TOOSHORT : FileCategory.OTHER; // default if none of the conditions pass if (firstFour.SequenceEqual(CompiledObject.MagicId)) { returnCat = FileCategory.KSM; } else { bool isAscii = firstFour.All(b => b == (byte)'\n' || b == (byte)'\t' || b == (byte)'\r' || (b >= (byte)32 && b <= (byte)127)); if (isAscii) { returnCat = FileCategory.ASCII; } } return(returnCat); // There is not currently an explicit test for KERBOSRIPT versus other types of ASCII. // At current, any time you want to test for is Kerboscript, make sure to test for is ASCII too, // since nothing causes a file to become type kerboscript yet. }