IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Программирование (https://www.imho.ws/forumdisplay.php?f=40)
-   -   c#: Чтение строки UTF16 из файла (https://www.imho.ws/showthread.php?t=91985)

Al-x 03.09.2005 13:50

c#: Чтение строки UTF16 из файла
 
Есть бинарный файл (база iPod) открытый через BinaryReader. Программа находит Position в файле с которого надо прочитать строку UTF16 (без 0x00 на конце) в string. Длина строки в байтах известна.
Как прочитать эту строку в string?
Пробую делать через ReadChars, но читает один байт в один char (в MSDN пишут, что там char двухбайтовый). :confused:

Al-x 03.09.2005 15:54

Короче сам разобрался :)
Код:

               
private System.Char[] tmpChars;
private byte[] tmpBytes;
......                               
UnicodeEncoding Unicode = new UnicodeEncoding();
.....
BinaryReader binReader = new BinaryReader(File.Open(fileName, FileMode.Open));
.....
tmpChars = new System.Char[stringLength/2];
tmpBytes = new byte[stringLength];
tmpBytes = binReader.ReadBytes(stringLength);
tmpChars = Unicode.GetChars(tmpBytes);
tmpString = new String(tmpChars);

Некрасиво - зато работает. Может это как-нибудь проще можно сделать?

RaZEr 03.09.2005 17:22

StreamReader не подойдёт?

Al-x 03.09.2005 22:05

Когда я првязываю StreamReader к потоку (BaseStream) BinaryReader, то после вызова Read указатель в потоке "улетает" совсем не туда, куда я ожидаю - при первом чтении на много символов вперёд, при втором - вообще никуда не двигается. :idontnow:
Код:

BinaryReader binReader = new BinaryReader(File.Open(fileName, FileMode.Open));
StreamReader strReader = new StreamReader(binReader.BaseStream,System.Text.Encoding.Unicode);

Читаю так в цикле (stringLength - длина строки в байтах, перед чтением курсор стоит на месте с которого читать):
Код:

tmpChars = new System.Char[stringLength/2];
strReader.Read(tmpChars,0,stringLength/2);
tmpString = new String(tmpChars);

Может есть где примерчик?

RaZEr 03.09.2005 22:09

Цитата:

Может есть где примерчик?
Вот например конвертатор UTF8->UCS2:
Код:

using System;
using System.IO;
using System.Text;

public class FileConverter
{
    const int BufferSize = 8096;
   
    public static void Main(string[] args)
    {
        if (args.Length != 2)
        {
            Console.WriteLine
                ("Usage: FileConverter <input file> <output file>");
            return;
        }
       
        // Open a TextReader for the appropriate file
        using (TextReader input = new StreamReader
              (new FileStream (args[0], FileMode.Open),
                Encoding.UTF8))
        {
            // Open a TextWriter for the appropriate file
            using (TextWriter output = new StreamWriter
                  (new FileStream (args[1], FileMode.Create),
                    Encoding.Unicode))
            {

                // Create the buffer
                char[] buffer = new char[BufferSize];
                int len;
               
                // Repeatedly copy data until we've finished
                while ( (len = input.Read (buffer, 0, BufferSize)) > 0)
                {
                    output.Write (buffer, 0, len);
                }
            }
        }
    }
}



Часовой пояс GMT +4, время: 04:19.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.