23.01.2009, 07:16 | #1 |
HAI; CAN HAS STDIO?
|
ASCII NULL
хелло.
задача: сгенерировать текстовый файл из аксапты (2009 SP1), причем файл должен иметь специальную последовательность символов в самом начале. эта последовательность состоит из набора непечатных ASCII символов, а главное, в ней 60 символов ASCII NULL. проблема: перебрал разные варианты, но не могу записать символ ASCII NULL в файл. просто ничего не пишется если я передаю в fileio.write num2char(hex2int("00")), или пишется символ "0", если я использую fileio.write(0), что можно было ожидать на самом деле. смотрел образец в hex-редакторе, там 60 символов с кодом "00". вопрос: как же их писать в текстовый файл? ответ: пока писал сообщение, разобрался с проблемой и решил уже не стирать. в результате я сначала создаю Binary, формирую в нем заголовок, записываю Binary в BinData, а его, в свою очередь, в файл, затем уже открываю его как TextIO и пишу нужную информацию. спасибо за внимание
__________________
our sharp bitter vitriol is not that of the vulgar. |
|
23.01.2009, 09:19 | #2 |
Участник
|
а если writeRaw(num2char(0)) ?
|
|
23.01.2009, 11:07 | #3 |
NavAx
|
может BinaryIO надо использовать
|
|
28.01.2009, 07:06 | #4 |
HAI; CAN HAS STDIO?
|
это чей такой метод, WriteRaw? если речь идет про TextIo, то нет, не пишет он таким образом ASCII NULL символ. ни WriteRaw, ни WriteChar(0).
а вот если вы про XmlTextWriter, то я еще не пробовал. зато точно говорю, что BinData + Binary работают: X++: BinData data = new BinData(); Binary myChar = new Binary(98); ; myChar.byte(0, hex2int("98")); myChar.byte(1, hex2int("01")); myChar.byte(2, hex2int("43")); myChar.byte(3, hex2int("50")); myChar.byte(4, hex2int("5F")); myChar.byte(5, hex2int("46")); myChar.byte(6, hex2int("53")); myChar.byte(7, hex2int("50")); myChar.byte(8, hex2int("53")); myChar.byte(9, hex2int("5F")); myChar.byte(10, hex2int("42")); myChar.byte(11, hex2int("4F")); myChar.byte(12, hex2int("4F")); myChar.byte(13, hex2int("4B")); data.setBinaryData(myChar); data.saveFile("C:\\temp\\temp.txt");
__________________
our sharp bitter vitriol is not that of the vulgar. |
|
28.01.2009, 08:12 | #5 |
MCTS
|
Недавно решал подобную задачу, нужно было размер файла изменить. Используются чистые winapi функции. При этом в файл пишутся те самые нули. Может пригодится :
X++: int handle; ; handle = WinAPI::CreateFile("C:\\Temp\\AX.TXT", #CREATE_ALWAYS, #GENERIC_WRITE); WinAPI::SetFilePointer(handle, 60, 2); WinAPI::SetEndOfFile(handle); WinAPI::CloseHandle(handle); X++: static int SetFilePointer(int _handle, int _lDistanceToMove, int _dwMoveMethod ) { DLL _winApiDLL = new DLL('KERNEL32'); DLLFunction _SetFilePointer = new DLLFunction(_winApiDLL, 'SetFilePointer'); _SetFilePointer.returns(ExtTypes::DWord); _SetFilePointer.arg(ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord); return _SetFilePointer.call(_handle, _lDistanceToMove, 0, _dwMoveMethod); } static int SetEndOfFile(int _handle ) { DLL _winApiDLL = new DLL('KERNEL32'); DLLFunction _SetEndOfFile = new DLLFunction(_winApiDLL, 'SetEndOfFile'); _SetEndOfFile.returns(ExtTypes::DWord); _SetEndOfFile.arg(ExtTypes::DWord); return _SetEndOfFile.call(_handle); } Последний раз редактировалось Eldar9x; 28.01.2009 в 08:24. |
|