Как преобразовать от EBCDIC до ASCII в C#.net

У меня есть значение в формате EBCDIC "000000 {". Я хочу преобразовать его в a. Сетевой тип Int32. Кто-либо может сообщить мне то, что я могу делать с этим?? Таким образом, моему вопросу дают строку, которая содержит числовое со знаком в EBCDIC, что должно я сделать для преобразования его в Int32.NET.

Большое спасибо заранее!

10
задан Tom 18 May 2010 в 14:35
поделиться

4 ответа

Вы захотите прочитать о десятичных дробях с двоичным кодом , так как это то, с чем вы сталкиваетесь, и есть вопросы, на которые нужно ответить, прежде чем вы действительно сможете это закодировать.

Если значение представляет собой один символ, это может быть так же просто, как получить номер символа, но вам нужно знать, является ли система Big Endian (как и большинство мэйнфреймов, из которых вы будете получать файлы в кодировке EBDIC) или Little Endian (как и в более современных ОС).

Если ваше целочисленное значение использует более одного символа и включает знак (как вы упомянули), то это более сложно. Скорее всего, каждая половина (или «полубайт», или 4 бита) каждого символа представляет собой число - может быть, от 0 до 9 или в шестнадцатеричном формате от 0 до F, и строка дополняется нулями (фактически нулями) слева, и последний кусочек содержит знак. Эту систему можно на каком-то языке назвать Zoned Decimal .

В общем, я бы рекомендовал начать с чтения этой статьи, которая познакомит вас с тем, как данные хранятся / хранятся на мэйнфреймах на основе COBOL , и поможет вам двигаться в правильном направлении.


В C # вы можете выполнить преобразование из обычного Zoned Decimal (которое, по вашему мнению, лучше всего подходит для входящих данных), используя int.Parse с правильными параметрами NumberStyles , например:

int val = int.Parse(num, NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite);
3
ответ дан 3 December 2019 в 14:33
поделиться

Следующая программа работала для преобразования значения EBCDIC в целое число при получении данных от одного из наших клиентов. Данные, которые мы получаем, могут быть частью того, что вы можете получить, поэтому посмотрите, сработает ли это для вас:

using System;
using System.Text;

namespace ConsoleApplication6
{
    class Program
    {
        static void Main(string[] args)
        {
            string strAmount = "00007570{";
            Console.WriteLine("{0} is {1}", strAmount, ConvertEBCDICtoInt(strAmount));
            strAmount = "000033}";
            Console.WriteLine("{0} is {1}", strAmount, ConvertEBCDICtoInt(strAmount));
            Console.ReadLine();
        }

        // This converts "00007570{" into "75700", and "000033}" into "-330"
        public static int? ConvertEBCDICtoInt(string i_strAmount)
        {
            int? nAmount = null;

            if (string.IsNullOrEmpty(i_strAmount))
                return(nAmount);

            StringBuilder strAmount = new StringBuilder(i_strAmount);
            if (i_strAmount.IndexOfAny(new char[] { '}', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R' }) >= 0)
                strAmount.Insert(0, "-");

            strAmount.Replace("{", "0");
            strAmount.Replace("}", "0");
            strAmount.Replace("A", "1");
            strAmount.Replace("J", "1");
            strAmount.Replace("B", "2");
            strAmount.Replace("K", "2");
            strAmount.Replace("C", "3");
            strAmount.Replace("L", "3");
            strAmount.Replace("D", "4");
            strAmount.Replace("M", "4");
            strAmount.Replace("E", "5");
            strAmount.Replace("N", "5");
            strAmount.Replace("F", "6");
            strAmount.Replace("O", "6");
            strAmount.Replace("G", "7");
            strAmount.Replace("P", "7");
            strAmount.Replace("H", "8");
            strAmount.Replace("Q", "8");
            strAmount.Replace("I", "9");
            strAmount.Replace("R", "9");

            // Convert the amount to a int:
            int n;
            if (int.TryParse(strAmount.ToString(), out n))
                nAmount = n;
            return (nAmount);
        }
    }
}
4
ответ дан 3 December 2019 в 14:33
поделиться

Попробуйте следующую функцию ..

public string ConvertEBCDICtoASCII(string strEBCDICString) {
    int[] e2a = new int[256]{
        0, 1, 2, 3,156, 9,134,127,151,141,142, 11, 12, 13, 14, 15,
        16, 17, 18, 19,157,133, 8,135, 24, 25,146,143, 28, 29, 30, 31,
        128,129,130,131,132, 10, 23, 27,136,137,138,139,140, 5, 6, 7,
        144,145, 22,147,148,149,150, 4,152,153,154,155, 20, 21,158, 26,
        32,160,161,162,163,164,165,166,167,168, 91, 46, 60, 40, 43, 33,
        38,169,170,171,172,173,174,175,176,177, 93, 36, 42, 41, 59, 94,
        45, 47,178,179,180,181,182,183,184,185,124, 44, 37, 95, 62, 63,
        186,187,188,189,190,191,192,193,194, 96, 58, 35, 64, 39, 61, 34,
        195, 97, 98, 99,100,101,102,103,104,105,196,197,198,199,200,201,
        202,106,107,108,109,110,111,112,113,114,203,204,205,206,207,208,
        209,126,115,116,117,118,119,120,121,122,210,211,212,213,214,215,
        216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,
        123, 65, 66, 67, 68, 69, 70, 71, 72, 73,232,233,234,235,236,237,
        125, 74, 75, 76, 77, 78, 79, 80, 81, 82,238,239,240,241,242,243,
        92,159, 83, 84, 85, 86, 87, 88, 89, 90,244,245,246,247,248,249,
        48, 49, 50, 51, 52, 53, 54, 55, 56, 57,250,251,252,253,254,255};

    char chrItem = Convert.ToChar("0");
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < strEBCDICString.Length; i++) {
        try {
            chrItem = Convert.ToChar(strEBCDICString.Substring(i, 1));
            sb.Append(Convert.ToChar(e2a[(int)chrItem]));
        } catch (Exception ex) {
            Console.WriteLine(ex.Message);
            return string.Empty;
        }

    }
    string result = sb.ToString();
    sb = null;
    return result;
}
0
ответ дан 3 December 2019 в 14:33
поделиться

Вообще говоря, вы должны быть в состоянии загрузить данные EBCDIC, используя правильный класс System.Text.Encoding (ссылка указывает на список всех кодировок, который включает кодировки EBCDIC). После этого строка в памяти становится Unicode и может быть сохранена в ASCII с помощью кодировки ASCII.

Это делает то, о чем вы просите в названии вопроса. Однако я не уверен, что это то, что вы хотели узнать, поскольку ваш вопрос не совсем ясен для меня. Если вам нужен код символа ASCII, вы можете просто привести символ к int, если это только символы ASCII.

1
ответ дан 3 December 2019 в 14:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: