Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Oracle > Как прочитать 4 байта (не символа) из файла


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

И вообще можно как нибудь без Java получить из BLOB/BFILE числовое значение любого байта, а лучше набор байт. Почему dbms_lob.read(Source,Count,Offset,Buffer);
Переменная Buffer не может быть ни байтом ни целым ни вообще киким нибудь числовым значением.

Автор: LSD 12.7.2005, 14:29
А порядок байт каким считать, little-endian или big-endian?

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

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

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

но надо без Java? ее заказчик не хочет даже видеть smile хотя для такого случая я готов выучить хоть Пролог, лишь бы вышеприведенную муть не писать.

Автор: igon 13.7.2005, 00:02
Твой 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;

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

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

Автор: igon 13.7.2005, 21:58
Цитата
Можно работать посимвольно, тогда 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

Автор: VIAcom 19.7.2005, 15:49
Всем огромное СПАСИБО! 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


Автор: igon 19.7.2005, 17:43
Код

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?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)