Re[3]: ADODB.Stream запись бинарника, JScript only!
От: Andir Россия
Дата: 09.06.04 23:18
Оценка:
Здравствуйте, EugeNet.Spb, Вы писали:

ES>Мне нужно генерить бинарные данные через мою простенькую функцию:


ES>hex2str( 'D5A90000300000004000000FFF' );

ES>которая возвращяет бинарную строку (String.fromCharCode);

Всё понял. Вся проблема не в стриме, ещё раз тебе напомню, а в строках. В JScript все строки по умолчанию в Unicode.
Получаем задачу: Имея некоторую бинарную строку записанную в Unicode нужно преобразовать в однобайтную кодировку и сохранить как бинарный файл.
Последовательность действий такая:
1) Получить бинарную строку (это ты делаешь сам).
2) Преобразовать строку к однобайтной кодировке
3) Сохранить преобразование.

Получаем следующий вариант.

var binString = ""; // Некоторая бинарная строка, ты её сам получаешь.

var outStreamW = new ActiveXObject("ADODB.Stream"); // Текстовый поток с кодировкой Unicode
outStreamW.Type = 2;

outStreamW.Open();
outStreamW.WriteText(binString);

outStreamW.Position = 0;

var outStreamA = new ActiveXObject("ADODB.Stream"); // Текстовый поток с однобайтной кодировкой
outStreamA.Type = 2;
outStreamA.Charset = "windows-1251"; // Почему не ASCII? а потому что в случае ASCII будут исковерканы байты со кодами больше 127.

outStreamA.Open();

outStreamW.CopyTo(outStreamA); // Преобразование с одной кодировки в другую.

outStreamA.SaveToFile("c:\\writetest.exe", 2); // Сохранение потока в файл.

outStreamW.Close();
outStreamA.Close();


Протестировал я это дело таким образом:

// Читаем бинарный файл, специально для теста
var inStream = new ActiveXObject("ADODB.Stream");
inStream.Type = 1;

inStream.Open();
inStream.LoadFromFile("c:\\readtest.exe");

inStream.Position = 0;

var binData = inStream.Read();

inStream.Close();

///////////////////////////////////////////////////

// Преобразовываем бинарные данные в строку

var bufferSize = 100000; 
var rs = new ActiveXObject("ADODB.Recordset");

rs.Fields.Append("test", 201, bufferSize, 0x80);
rs.Open();

rs.AddNew();
rs.Fields("test").AppendChunk(binData);
rs.Update();

rs.MoveFirst();

var binString = rs("test").GetChunk(bufferSize);

rs.Close();

//////////////////////////////////////////////////

// Строка сейчас находится в Unicode, благодаря JavaScript
// Ну и далее уже записываем строку в файл с преобразованием в однобайтную кодировку

var outStreamW = new ActiveXObject("ADODB.Stream");
outStreamW.Type = 2;

outStreamW.Open();
outStreamW.WriteText(binString);

outStreamW.Position = 0;

var outStreamA = new ActiveXObject("ADODB.Stream");
outStreamA.Type = 2;
outStreamA.Charset = "windows-1251";

outStreamA.Open();

outStreamW.CopyTo(outStreamA);

outStreamA.SaveToFile("c:\\writetest.exe", 2);

outStreamW.Close();
outStreamA.Close();


Применением diff получаем, что файлы writetest и readtest совпадают до байта.

C Уважением, Andir!
<< using(Rsdn@Home 1.1.4 beta 2){/* Работаем */} >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.