byte[] header = new byte[]{255, 216};
string ascii = Encoding.ASCII.GetString(header);
ASCII は FFD8 (JPEG SOI マーカー) と同等であると予想します
代わりに「????」が表示されます。
この場合、文字列に変換するのではなく、バイト配列を比較する方がよいでしょう。
文字列に変換する必要がある場合は、Latin-1 aka ISO-8859-1 aka Code Page 28591 エンコーディングを使用することをお勧めします。同じ 16 進数値 - このシナリオに便利です。次のいずれかがこのエンコーディングを取得します。
Encoding.GetEncoding(28591)
Encoding.GetEncoding("Latin1")
Encoding.GetEncoding("ISO-8859-1")
はい、それはASCIIが 7 ビットのみであるためです。127 を超える値は定義されていません。通常、エンコードは不明なバイナリ値を「?」にデコードします。(ただし、これはDecoderFallbackを使用して変更できます)。
「拡張 ASCII」に言及しようとしているのなら、実際に必要なEncoding.Default
のは「オペレーティング システムのデフォルト コード ページ」であると思います...ほとんどの西洋のシステムではコード ページ 1252だと思います。
予想していたキャラクターは?
編集:受け入れられた回答に従って(回答を追加した後に質問が編集されたと思われます。最初にJPEGについて何も見たことを思い出せません)、バイナリデータをテキストに変換しないでください。それが本当にエンコードされたテキストデータでない限り。JPEG データはバイナリデータであるため、実際のバイト数と予想されるバイト数をチェックする必要があります。
任意のバイナリ データ (画像、音楽、ビデオなど) を "プレーンな" テキスト エンコーディング (ASCII、UTF-8 など) を使用してテキストに変換すると、データが失われる危険があります。テキストに変換する必要がある場合は、安全で優れた Base64 を使用してください。ただし、予想されるバイナリ データと比較するだけの場合は、テキストに変換しないことをお勧めします。
編集:さて、これは特定のバイト配列の画像検出方法を支援するクラスです。HTTP 固有にはしていません。本当に をフェッチしInputStream
、それを少しだけ読み取ってから、ストリームを再度フェッチする必要があるかどうかは完全にはわかりません。バイト配列に固執することで問題を回避しました:)
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
public sealed class SignatureDetector
{
public static readonly SignatureDetector Png =
new SignatureDetector(0x89, 0x50, 0x4e, 0x47);
public static readonly SignatureDetector Bmp =
new SignatureDetector(0x42, 0x4d);
public static readonly SignatureDetector Gif =
new SignatureDetector(0x47, 0x49, 0x46);
public static readonly SignatureDetector Jpeg =
new SignatureDetector(0xff, 0xd8);
public static readonly IEnumerable<SignatureDetector> Images =
new ReadOnlyCollection<SignatureDetector>(new[]{Png, Bmp, Gif, Jpeg});
private readonly byte[] bytes;
public SignatureDetector(params byte[] bytes)
{
if (bytes == null)
{
throw new ArgumentNullException("bytes");
}
this.bytes = (byte[]) bytes.Clone();
}
public bool Matches(byte[] data)
{
if (data == null)
{
throw new ArgumentNullException("data");
}
if (data.Length < bytes.Length)
{
return false;
}
for (int i=0; i < bytes.Length; i++)
{
if (data[i] != bytes[i])
{
return false;
}
}
return true;
}
// Convenience method
public static bool IsImage(byte[] data)
{
return Images.Any(detector => detector.Matches(data));
}
}
私はかつて、バイト 0 ~ 255 を Unicode 文字 0 ~ 255 にエンコードし、また元に戻すカスタム エンコーダー/デコーダーを作成しました。
実際には文字列ではないものに対して文字列関数を使用する場合にのみ、本当に役立ちました。
次に書いた場合:
Console.WriteLine(ascii)
そして、「FFD8」が出力されることを期待していましたが、それは GetString が機能する方法ではありません。そのためには、次のものが必要です。
string ascii = String.Format("{0:X02}{1:X02}", header[0], header[1]);
本気ですか "????" 結果は?
結果は次のとおりです。
(int)ascii[0]
(int)ascii[1]
一方、純粋な ASCII は 0 ~ 127 のみです...