none
C# - MONO - ArgumentOutOfRangeException: ArgRange_Array Hatası RRS feed

  • Genel Tartışma

  • Herkese Merhabalar,

    Bir dil dosyası okuma sistemi yapıyorum. Hazır bir kod bulmuştum ve 3-4 ay önce kusursuz çalışıyordu. Fakat bugün tekrar denediğimde kod tamamen orjinal fakat nedense çalışmıyor.

    Bir çok sistemin kullandığı bir localization için bytereader okuyucu;

    https://github.com/hyuck0323/deresute/blob/master/ByteReader.cs

    HATA;

    ArgumentOutOfRangeException: ArgRange_Array
    Parameter name: count
    System.Text.UTF8Encoding.InternalGetCharCount (System.Byte[] bytes, Int32 index, Int32 count, UInt32 leftOverBits, UInt32 leftOverCount, System.Object provider, System.Text.DecoderFallbackBuffer& fallbackBuffer, System.Byte[]& bufferArg, Boolean flush) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Text/UTF8Encoding.cs:462)
    System.Text.UTF8Encoding.GetCharCount (System.Byte[] bytes, Int32 index, Int32 count) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Text/UTF8Encoding.cs:687)
    System.Text.Encoding.GetChars (System.Byte[] bytes, Int32 index, Int32 count) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Text/Encoding.cs:328)
    System.Text.Encoding.GetString (System.Byte[] bytes, Int32 index, Int32 count) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Text/Encoding.cs:751)
    System.Text.UTF8Encoding.GetString (System.Byte[] bytes, Int32 index, Int32 count) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Text/UTF8Encoding.cs:1052)

    //Hatayı tam bu satırda veriyor, count değeri -1 geliyor. Önceden böyle olmuyordu.

    return Encoding.UTF8.GetString(buffer, start, count);

    CSVReader;

    public sealed class CSVReader {
            private byte[] m_buffer;
    
            private int m_offset;
    
            private static List<string> m_temp = new List<string>();
    
            public bool CanRead {
                get { return this.m_buffer != null && this.m_offset < this.m_buffer.Length; }
            }
    
            public CSVReader(byte[] bytes) {
                this.m_buffer = bytes;
            }
    
            private static string ReadLine(byte[] buffer, int start, int count) {
                return Encoding.UTF8.GetString(buffer, start, count);
            }
    
            public string ReadLine() {
                return this.ReadLine(true);
            }
    
            public string ReadLine(bool skipEmptyLines) {
                int num = this.m_buffer.Length;
                if (skipEmptyLines) {
                    while (this.m_offset < num && this.m_buffer[this.m_offset] < 32) this.m_offset++;
                }
                int i = this.m_offset;
                if (i < num) {
                    while (i < num) {
                        int num2 = (int)this.m_buffer[i++];
                        if (num2 == 10 || num2 == 13) {
                            this.m_offset = i;
                            return CSVReader.ReadLine(this.m_buffer, this.m_offset, i - this.m_offset - 1);
                        }
                    }
                    i++;
                    return CSVReader.ReadLine(this.m_buffer, this.m_offset, i - this.m_offset - 1);
                }
                this.m_offset = num;
                return null;
            }
    
            public Dictionary<string, string> ReadDictionary() {
                Dictionary<string, string> dictionary = new Dictionary<string, string>();
                char[] separator = new char[] { '=' };
                while (this.CanRead) {
                    string text = this.ReadLine();
                    if (string.IsNullOrEmpty(text)) break;
                    if (!text.StartsWith("//")) {
                        string[] array = text.Split(separator, 2, StringSplitOptions.RemoveEmptyEntries);
                        if (array.Length == 2) {
                            string key = array[0].Trim();
                            string value = array[1].Trim().Replace("\\n", "\n");
                            dictionary[key] = value;
                        }
                    }
                }
                return dictionary;
            }

    Dosya içeriği ;

    "KEY"="ENGLISH"
    "KEY1","ENGLISH1"
    vb. gibi farklı kombinasyonlarda denedim.

    Yani ReadLine() komutu çalışmıyor. Çok güzel ve temiz bir kod. Ama önceden çalışıp şimdi neden çalışmadığına anlam veremiyorum. Tüm değerleri debug ettim, num2==13 olduğu zaman hata veriyor. Onun dışında herhangi bir null veya yanlış bir değer yok. Text dosyasını okuyup byte[] 'a ayırabiliyor.

    Yaklaşık iki gündür sırf bu hatayı çözmek için araştırma yapıyorum. Önceden kullandığım kod artık çalışmıyor nedense. Bu yüzden konu açtım.

    Şimdiden çok teşekkür ediyorum. (:

    20 Kasım 2016 Pazar 20:33

Tüm Yanıtlar