2010-12-11 2 views

Répondre

2

Les octets sont des octets. Il n'y a aucun moyen de déclarer que quelque chose n'est pas une donnée de fichier. Il serait assez facile de construire un fichier valide dans de nombreux formats composés uniquement d'ASCII imprimable. Surtout en traitant avec Unicode, vous êtes dans un territoire très trouble. Si possible, je suggère de modifier la méthode pour qu'elle prenne deux paramètres ... utilisez-en une pour le passage du texte et l'autre pour les données binaires.

Une chose que vous pourriez faire est de regarder la longueur de la chaîne. La plupart des formats d'image sont au moins 500-600 octets, même pour une image minuscule, et bien que ce ne soit en aucun cas un test précis, si vous obtenez, disons, une chaîne de 20k, c'est probablement une image. Si c'était du texte, ce serait un peu (comme le quart d'un roman typique, ou à peu près)

+0

Je suis d'accord avec vous et j'ai choisi le premier choix et je pense que c'est peut-être plus simple. Merci beaucoup. – ywenbo

1

Des fichiers tels que des images ou des fichiers audio ont des blocs définis qui peuvent être "reniflés". Wotsit.org a beaucoup d'informations sur les octets de clé et les moyens de déterminer ce que les fichiers sont. En regardant ces décalages d'octets dans vos données, vous pouvez le comprendre.

Une autre manière consiste à utiliser un peu de «magie», qui est le code pour renifler les octets de clé-clé ou octets dans un fichier pour essayer de comprendre ce que son type est. * Les systèmes nix l'ont intégré via la commande file. Faites un man file ou man magic pour plus d'informations ou consultez l'article de Wikipedia sur Magic numbers in files.

Ruby Filemagic utilise la même technique mais est basé sur libmagic de GNU.

+0

il semble que les liens ne sont pas adaptés à mon intention. Mon contexte est qu'il y a une méthode ruby, elle accepte une chaîne de paramètre, peut-être une chaîne littérale, peut-être une chaîne d'image blob, donc j'ai besoin d'un contenu de chaîne différent pour faire différentes opérations. En fait, s'il y a un type de Blob en rubis, je pense que cela résoudra peut-être mon problème, mais je ne le trouve pas. – ywenbo

0

Qu'est-ce qui constituerait une chaîne? Attendez-vous un ASCII simple? UTF-8? Ou texte codé d'une autre manière? Si vous savez que vous allez obtenir du texte ASCII ou un blob, alors vous pouvez simplement faire défiler les premiers n octets et voir si quelque chose a huit bits, ce qui vous dirait que vous avez binaire. OTOH, ne rien trouver ne garantirait pas que vous aviez du texte.

Si vous voulez obtenir UTF-8 Unicode alors vous feriez la même chose mais recherchez des séquences UTF-8 invalides. Bien sûr, les mêmes mises en garde s'appliquent.

Vous pouvez numériser les premiers n octets pour tout ce qui se situe entre 0x00 et 0x20. Si vous trouvez des octets si bas alors vous avez probablement un blob binaire quelconque. Mais peut-être pas. Comme le dit Tyler Eaves, les octets sont des octets. Vous commencez avec un tas d'octets et essayez d'en trouver une interprétation qui a du sens.

Le mieux est de faire en sorte que l'appelant fournisse l'interprétation attendue ou de suivre les conseils de Greg et d'utiliser une bibliothèque de nombres magiques.

+0

merci beaucoup, enfin j'ai ajouté un paramètre de plus à distinguer. En tout cas merci beaucoup. – ywenbo

Questions connexes