byte[] header = new byte[]{255, 216};
string ascii = Encoding.ASCII.GetString(header);
Run Code Online (Sandbox Code Playgroud)
我希望ASCII等于FFD8(JPEG SOI标记)
相反,我得到"????"
Joe*_*Joe 11
在这种情况下,您最好比较字节数组而不是转换为字符串.
如果你必须转换为字符串,我建议使用编码Latin-1 aka ISO-8859-1 aka Code Page 28591编码,因为这个编码将所有字符都映射到十六进制值在0-255范围内的Unicode字符与相同的十六进制值 - 方便此方案.以下任何一种都将获得此编码:
Encoding.GetEncoding(28591)
Encoding.GetEncoding("Latin1")
Encoding.GetEncoding("ISO-8859-1")
Run Code Online (Sandbox Code Playgroud)
是的,那是因为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));
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
25743 次 |
| 最近记录: |