imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 03.09.2005, 13:50     # 1
Al-x
Junior Member
 
Регистрация: 30.03.2003
Адрес: СПб
Сообщения: 162

Al-x МолодецAl-x МолодецAl-x Молодец
c#: Чтение строки UTF16 из файла

Есть бинарный файл (база iPod) открытый через BinaryReader. Программа находит Position в файле с которого надо прочитать строку UTF16 (без 0x00 на конце) в string. Длина строки в байтах известна.
Как прочитать эту строку в string?
Пробую делать через ReadChars, но читает один байт в один char (в MSDN пишут, что там char двухбайтовый).
__________________
640Kbytes should be enough for everything! (c) Bill Gates, 1981.
Все "спасибо" в репутацию
Al-x вне форума  
Старый 03.09.2005, 15:54     # 2
Al-x
Junior Member
 
Регистрация: 30.03.2003
Адрес: СПб
Сообщения: 162

Al-x МолодецAl-x МолодецAl-x Молодец
Короче сам разобрался
Код:
		
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);
Некрасиво - зато работает. Может это как-нибудь проще можно сделать?
__________________
640Kbytes should be enough for everything! (c) Bill Gates, 1981.
Все "спасибо" в репутацию
Al-x вне форума  
Старый 03.09.2005, 17:22     # 3
RaZEr
МОД-Оператор ЭВМ
 
Аватар для RaZEr
 
Регистрация: 18.04.2002
Адрес: Питер
Сообщения: 4 343

RaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех Гуру
StreamReader не подойдёт?
RaZEr вне форума  
Старый 03.09.2005, 22:05     # 4
Al-x
Junior Member
 
Регистрация: 30.03.2003
Адрес: СПб
Сообщения: 162

Al-x МолодецAl-x МолодецAl-x Молодец
Когда я првязываю StreamReader к потоку (BaseStream) BinaryReader, то после вызова Read указатель в потоке "улетает" совсем не туда, куда я ожидаю - при первом чтении на много символов вперёд, при втором - вообще никуда не двигается.
Код:
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);
Может есть где примерчик?
__________________
640Kbytes should be enough for everything! (c) Bill Gates, 1981.
Все "спасибо" в репутацию
Al-x вне форума  
Старый 03.09.2005, 22:09     # 5
RaZEr
МОД-Оператор ЭВМ
 
Аватар для RaZEr
 
Регистрация: 18.04.2002
Адрес: Питер
Сообщения: 4 343

RaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех ГуруRaZEr Отец (мать) всех Гуру
Цитата:
Может есть где примерчик?
Вот например конвертатор 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);
                }
            }
        }
    }
}
RaZEr вне форума  


Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


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




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