Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как прочитать 4 байта (не символа) из файла 
:(
    Опции темы
VIAcom
Дата 12.7.2005, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 2.5.2005
Где: г. Казань, Емноно вский Хутор.

Репутация: нет
Всего: нет



Хочу писаь/читать Integer не в текстовом виде как '12345', а просто 4 байта, сколько он (integer) вроде и занимет.

И вообще можно как нибудь без Java получить из BLOB/BFILE числовое значение любого байта, а лучше набор байт. Почему dbms_lob.read(Source,Count,Offset,Buffer);
Переменная Buffer не может быть ни байтом ни целым ни вообще киким нибудь числовым значением.
PM MAIL ICQ   Вверх
LSD
Дата 12.7.2005, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



А порядок байт каким считать, little-endian или big-endian?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
VIAcom
Дата 12.7.2005, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 2.5.2005
Где: г. Казань, Емноно вский Хутор.

Репутация: нет
Всего: нет



Нет разницы чесно говоря, я даже один байт не могу поднять, т.к. ASCII() не работает для значений символов #00 - #31 ибо они служебные и в набор не входят по всей видимости. короче вместо a=3 получаю a=48

если есть чем прочитать хотябы 1 байт - остальное пустяки. Криво но напишу что нибудь вроде

n:=b1*1 + b2*64 + b3*65536;

но надо без Java? ее заказчик не хочет даже видеть smile хотя для такого случая я готов выучить хоть Пролог, лишь бы вышеприведенную муть не писать.
PM MAIL ICQ   Вверх
igon
Дата 13.7.2005, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 327
Регистрация: 30.10.2004

Репутация: 7
Всего: 21



Твой Buffer имеет тип RAW.
Используй функцию RAWTOHEX(), чтобы получить шестнадцатиричное char представление твоего Buffer: каждый байт будет представлен парой символов (от '00' до 'FF'). У Oracle вроде нет нужных функций (типа HexToNumber()), придется писать свой конвертер, что-то вроде
Код

create or replace Function Raw_To_Number(iRAW Raw) 
Return Number
is
  vHex Varchar2(8) := RAWTOHEX(iRAW); -- Предполагаем, что на входе 4 байта, не более
  vByteAsString Varchar2(2) :='';
  vResult Number := 0;
  Function getByteAsNumber(iString Varchar2)
    Return Number
    Is
    vByteAsNumber Number := 0; 
    Begin
-- здесь либо длиннющий if...elsif
-- либо поиск в заранее подготовленном массиве
-- myArray[0] := '00';
-- ...
-- myArray[160] := 'A0';
-- ...
-- myArray[255] := 'FF';
-- либо аналитически
      Return vByteAsNumber;
    End;
begin
  For i In 1..length(vHex)/2
    Loop
     vByteAsString := substr(vHex,2*i,2);
     vResult := vResult+getByteAsNumber(vByteAsString)*POWER(256, i-1);
    End Loop;
  Return vResult;
end Raw_To_Number;



--------------------
Хотите поговорить об этом?
PM   Вверх
LSD
Дата 13.7.2005, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



Можно работать посимвольно, тогда if...elsif будет короче.

А вообще мне не очень ясно, чем вызванно такое неприятие Java. Там все это делается гораздо проще.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
igon
Дата 13.7.2005, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 327
Регистрация: 30.10.2004

Репутация: 7
Всего: 21



Цитата
Можно работать посимвольно, тогда if...elsif будет короче.

Угу, но это уже
Цитата
-- либо аналитически

типа
Код

decode(substr(vByteAsString,1,1),'A',10,'B',11,...,to_number(substr(vByteAsString,1,1)))*16 + decode(substr(vByteAsString,2,1),'A',10,'B',11,...,to_number(substr(vByteAsString,2,1)))


Цитата
А вообще мне не очень ясно, чем вызванно такое неприятие Java.

У тебя была такая классная подпись... smile

to VIAcom
хранимые на Java + wrap -> и ничего заказчик не увидит smile



--------------------
Хотите поговорить об этом?
PM   Вверх
VIAcom
Дата 19.7.2005, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 2.5.2005
Где: г. Казань, Емноно вский Хутор.

Репутация: нет
Всего: нет



Всем огромное СПАСИБО! smile
Код

function HexRaw_To_Int(HexRaw raw) return integer
  is
    Length_ binary_integer;
    i       binary_integer;
    b       raw(1);
    result  binary_integer;
  begin
    Length_:=Length(HexRaw)/2;
    Result:=0;
    for i in 0..Length_-1 loop
      b:=substr(HexRaw,i*2+1,2);
      Result:=Result + to_number(b,'XX')*power(2,i);
    end loop;
    return Result;
  end HexRaw_To_Int;

Вот такое рабочее решение, несколько медленно, т.к. возвожу в сепень ... но зато коротко и красиво. smile


PM MAIL ICQ   Вверх
igon
Дата 19.7.2005, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 327
Регистрация: 30.10.2004

Репутация: 7
Всего: 21



Код

function HexRaw_To_Int(HexRaw raw) return integer
  is
  begin
    return to_number(HexRaw,'XXXXXXXX');
  end HexRaw_To_Int;

smile

BTW
Цитата
power(2,i)

2? Не 256?



--------------------
Хотите поговорить об этом?
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.0582 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.