c#和Encoding.ASCII.GetString

时间:2009-05-31 14:45:23

标签: c# encoding ascii

byte[] header = new byte[]{255, 216}; 

string ascii =  Encoding.ASCII.GetString(header);

我希望ASCII等于FFD8(JPEG SOI标记)

相反,我得到“????”

5 个答案:

答案 0 :(得分:11)

在这种情况下,您最好比较字节数组而不是转换为字符串。

如果你必须转换为字符串,我建议使用编码Latin-1又名ISO-8859-1编码,因为这种编码将所有带十六进制值的字节映射到0-255到Unicode的范围内具有相同十六进制值的字符 - 方便此方案。以下任何一种都将获得此编码:

Encoding.GetEncoding(28591)
Encoding.GetEncoding("Latin1")
Encoding.GetEncoding("ISO-8859-1")

答案 1 :(得分:8)

是的,那是因为ASCII只有7位 - 它没有定义任何大于127的值。编码通常将未知的二进制值解码为'?' (虽然可以使用DecoderFallback)更改。

如果您要提及“扩展ASCII”,我怀疑您实际上想要Encoding.Default这是“操作系统的默认代码页”...... code page 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));
    }        
}

答案 2 :(得分:1)

如果你写了:

Console.WriteLine(ascii)

预计“FFD8”打印出来,这不是GetString的工作方式。为此,您需要:

 string ascii = String.Format("{0:X02}{1:X02}", header[0], header[1]);   

答案 3 :(得分:1)

我曾经写过一个自定义编码器/解码器,它将字节0-255编码为unicode字符0-255然后再返回。

对于实际上不是字符串的东西使用字符串函数非常有用。

答案 4 :(得分:0)

你确定“????”是结果?

结果是什么:

(int)ascii[0]
(int)ascii[1]

另一方面,纯ASCII仅为0-127 ......