Як отримати символ для заданого значення ascii


Відповіді:


152

Ви маєте на увазі "А" (а string) або "А" (а char)?

int unicode = 65;
char character = (char) unicode;
string text = character.ToString();

Зверніть увагу, що я посилався на Unicode, а не на ASCII, оскільки це кодування рідних символів C #; по суті, кожен charє кодовою точкою UTF-16.


@Jon Skeet: якщо я встановив unicode = 128, чому я не змушений отримувати відповідний йому символ.
Iorn Man

@EthanHunt: Тоді ви отримаєте U + 0080, який є контрольним символом. Підозрюю, ви думаєте про 128 в іншому кодуванні символів.
Джон Скіт,

@Jon skeet: насправді я хочу відобразити значення символів для 0x80, 0x81- oxFF (я перетворюю ці значення в десяткові, тобто 128-255, але я не міг отримати відповідний йому символ.), Як я можу відображати ці символи теж.
Iorn Man

@EthanHunt: Що ви маєте на увазі під "значеннями символів"? U + 0080 - це керуючий символ - як би ви очікували його відображення? Знову ж таки, я підозрюю, що ви насправді говорите про значення 128-255 в якомусь іншому кодуванні, але ви не сказали нам, що це за кодування.
Джон Скіт,

@Jon Skeet: насправді я новачок у c #, я роблю віртуальну клавіатуру, як додаток, в якому я хочу встановити ці символи на кнопках як текст.
Iorn Man


13

Це працює в моєму коді.

string asciichar = (Convert.ToChar(65)).ToString();

Повернення: asciichar = 'A';


8

Є кілька способів зробити це.

Використання char-структури (для рядка і назад)

string _stringOfA = char.ConvertFromUtf32(65);

int _asciiOfA = char.ConvertToUtf32("A", 0);

Просто додайте значення (символи та рядок показані)

char _charA = (char)65;

string _stringA = ((char)65).ToString();

Використання ASCIIEncoding.
Це може бути використано в циклі для створення цілого масиву байтів

var _bytearray = new byte[] { 65 };

ASCIIEncoding _asiiencode = new ASCIIEncoding();

string _alpha = _asiiencode .GetString(_newByte, 0, 1);

Ви можете замінити клас перетворювача типів, це дозволить вам виконати якусь химерну перевірку значень:

var _converter = new ASCIIConverter();

string _stringA = (string)_converter.ConvertFrom(65);

int _intOfA = (int)_converter.ConvertTo("A", typeof(int));

Ось клас:

public class ASCIIConverter : TypeConverter
{
    // Overrides the CanConvertFrom method of TypeConverter.
    // The ITypeDescriptorContext interface provides the context for the
    // conversion. Typically, this interface is used at design time to 
    // provide information about the design-time container.
    public override bool CanConvertFrom(ITypeDescriptorContext context,
       Type sourceType)
    {
        if (sourceType == typeof(string))
        {
            return true;
        }
        return base.CanConvertFrom(context, sourceType);
    }

    public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
    {
        if (destinationType == typeof(int))
        {
            return true;
        }
        return base.CanConvertTo(context, destinationType);
    }


    // Overrides the ConvertFrom method of TypeConverter.
    public override object ConvertFrom(ITypeDescriptorContext context,
       CultureInfo culture, object value)
    {

        if (value is int)
        {
            //you can validate a range of int values here
            //for instance 
            //if (value >= 48 && value <= 57)
            //throw error
            //end if

            return char.ConvertFromUtf32(65);
        }
        return base.ConvertFrom(context, culture, value);
    }

    // Overrides the ConvertTo method of TypeConverter.
    public override object ConvertTo(ITypeDescriptorContext context,
       CultureInfo culture, object value, Type destinationType)
    {
        if (destinationType == typeof(int))
        {
            return char.ConvertToUtf32((string)value, 0);
        }
        return base.ConvertTo(context, culture, value, destinationType);
    }
}

1

Це також можна зробити будь-яким іншим способом

byte[] pass_byte = Encoding.ASCII.GetBytes("your input value");

а потім роздрукуйте результат. за допомогою foreachциклу.


0

Ось функція, яка працює для всіх 256 байт і гарантує, що ви побачите символ для кожного значення:

static char asciiSymbol( byte val )
{
    if( val < 32 ) return '.';  // Non-printable ASCII
    if( val < 127 ) return (char)val;   // Normal ASCII
    // Workaround the hole in Latin-1 code page
    if( val == 127 ) return '.';
    if( val < 0x90 ) return "€.‚ƒ„…†‡ˆ‰Š‹Œ.Ž."[ val & 0xF ];
    if( val < 0xA0 ) return ".‘’“”•–—˜™š›œ.žŸ"[ val & 0xF ];
    if( val == 0xAD ) return '.';   // Soft hyphen: this symbol is zero-width even in monospace fonts
    return (char)val;   // Normal Latin-1
}

Якщо метою було отримати видиму кодову точку Unicode для кожної кодової точки ASCII, тоді Control Pictures можна було б використовувати для заміни символів C0 Control . ␀ ␁ ␂ ␃ ␄ ␅ ␆ ␇ ␈ ␉ ␊ ␋ ␌ ␍ ␎ ␏…
Tom Blodget

1
@TomBlodget Приємно знати, але це не відповідь на запитання OP. Не соромтеся подавати ще одну функцію C #, яка буде виконувати те, про що вимагав ОП.
Soonts

1
Зверніть увагу, що ASCII досягає лише 127. Все, що вище, просто не є ASCII, тому принаймні ваш метод має погану назву.
Джон Скіт,

він також обробляє несподівані цифри, приголомшливо.
Sayed Muhammad Idrees


-1

Я вважаю, що простий акторський склад може працювати

int ascii = (int) "A"


Тепер він хотів допомогти з протилежним .. Отримання символу від числа
StefanE

11
Не те, що заданий код все одно буде скомпільований - ви не можете перетворити з stringна int. Якби це було 'A'тоді, це спрацювало б, але акторський склад був би зайвим, оскільки існує неявне перетворення з charна int.
Джон Скіт,

-2

На жаль, я не знаю Java, але сьогодні зі мною зіткнулася з тією ж проблемою, тому я написав це (це на c #)

public string IncrementString(string inboundString)    {
byte[] bytes = System.Text.Encoding.ASCII.GetBytes(inboundString.ToArray);
bool incrementNext = false;

for (l = -(bytes.Count - 1); l <= 0; l++) {
    incrementNext = false;

    int bIndex = Math.Abs(l);
    int asciiVal = Conversion.Val(bytes(bIndex).ToString);

    asciiVal += 1;

    if (asciiVal > 57 & asciiVal < 65)
        asciiVal = 65;
    if (asciiVal > 90) {
        asciiVal = 48;
        incrementNext = true;
    }

    bytes(bIndex) = System.Text.Encoding.ASCII.GetBytes({ Strings.Chr(asciiVal) })(0);

    if (incrementNext == false)
        break; // TODO: might not be correct. Was : Exit For
}

inboundString = System.Text.Encoding.ASCII.GetString(bytes);

return inboundString;
}

Щоб отримати кожну комбінацію, просто запустіть її у циклі.

Код повністю переплутаний!
Sayed Muhammad Idrees
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.