Как прочитать 4 байта (не символа) из файла

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

И вообще можно как нибудь без Java получить из BLOB/BFILE числовое значение любого байта, а лучше набор байт. Почему dbms_lob.read(Source,Count,Offset,Buffer);
Переменная Buffer не может быть ни байтом ни целым ни вообще киким нибудь числовым значением.
Comments (7)
ava
LSD | 12.07.2005, 14:29 #
А порядок байт каким считать, little-endian или big-endian?
ava
VIAcom | 12.07.2005, 15:38 #
Нет разницы чесно говоря, я даже один байт не могу поднять, т.к. ASCII() не работает для значений символов #00 - #31 ибо они служебные и в набор не входят по всей видимости. короче вместо a=3 получаю a=48

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

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

но надо без Java? ее заказчик не хочет даже видеть :( хотя для такого случая я готов выучить хоть Пролог, лишь бы вышеприведенную муть не писать.
ava
igon | 13.07.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;
ava
LSD | 13.07.2005, 09:20 #
Можно работать посимвольно, тогда if...elsif будет короче.

А вообще мне не очень ясно, чем вызванно такое неприятие Java. Там все это делается гораздо проще.
ava
igon | 13.07.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.

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

to VIAcom
хранимые на Java + wrap -> и ничего заказчик не увидит smile
ava
VIAcom | 19.07.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

ava
igon | 19.07.2005, 17:43 #

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

:)

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

2? Не 256?
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
ava  LSD   igon   VIAcom
advanced
Submit