Здравствуйте, 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){/* Работаем */} >>