Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

Байты в число и число в байты нужной размерности   Найти похожие ветки 

 
РП   (2010-05-20 16:37) [0]

Допустим:

байты: 145 193 041 равны числу 19410
type
TMyInteger = array[0..3] of byte;
...
var
MyInteger:TMyInteger;
N:Integer;
...
Pointer(MyInteger):=Pointer(N);


Как можно таким образом преобразовать  10 байт в число, допустим записать его в строку. И обратно из этого числа в 10 байт.


 
Медвежонок Пятачок ©   (2010-05-20 16:39) [1]

десятибайтовых чисел в д не бывает


 
turbouser ©   (2010-05-20 16:41) [2]


> Медвежонок Пятачок ©   (20.05.10 16:39) [1]

Extended = 12 байт. ;) Но автору это не подойдет.
Длинная арифметика, как всегда.


 
RWolf ©   (2010-05-20 16:42) [3]


> байты: 145 193 041 равны числу 19410

это в какой кодировке?


 
Медвежонок Пятачок ©   (2010-05-20 16:42) [4]

А у меня экстендед как раз 10 байт :)


 
Пылкий   (2010-05-20 16:44) [5]

ну допустим 8 байт. раве нельзя как-то это уладить?


 
turbouser ©   (2010-05-20 16:47) [6]


> Медвежонок Пятачок ©   (20.05.10 16:42) [4]

А, точно :)


 
Медвежонок Пятачок ©   (2010-05-20 16:47) [7]

int64, pint64


 
turbouser ©   (2010-05-20 16:48) [8]


> Пылкий   (20.05.10 16:44) [5]

Int64, UInt64 ?


 
turbouser ©   (2010-05-20 16:48) [9]

:)


 
RWolf ©   (2010-05-20 16:53) [10]


> РП   (20.05.10 16:37) 

напиши процедуры для арифметических действий с 10-байтовыми числами.  Число переводи в десятичное строковое представление взятием остатка от деления на 10 в цикле.


 
РП   (2010-05-20 17:02) [11]

RWolf
в этом и загвостка, что я получу от остатка.. перевернет число

346/10 =6
34/10 = 4
3/10 = 3

или я не так понял?


 
RWolf ©   (2010-05-20 17:05) [12]


> РП   (20.05.10 17:02) [11]

расположить в строке символы в обратном порядке совсем несложно.


 
РП   (2010-05-20 17:09) [13]

RWolf, не в этом дело..

если взять

байты: 145 193 041 равны числу 19410
type
TMyInteger = array[0..3] of byte;
...
var
MyInteger:TMyInteger;
N:Integer;
...
Pointer(MyInteger):=Pointer(N);


 
Медвежонок Пятачок ©   (2010-05-20 17:10) [14]

байты: 145 193 041 равны числу 19410

они там тоже перевернутые


 
РП   (2010-05-20 17:14) [15]

type
TMyInteger = array[0..3] of byte;

var
MyInteger:TMyInteger;
N:Integer;
begin
MyInteger[0] := 145;
MyInteger[1] := 193;
MyInteger[2] := 041;

Pointer(N):= Pointer(MyInteger);


реузльтат: 2736529

но как больше array[0..3] это не катит.


 
Медвежонок Пятачок ©   (2010-05-20 17:17) [16]

но как больше array[0..3] это не катит.

C интегером не катит. Зато катит с int64 [0..7]


 
RWolf ©   (2010-05-20 17:19) [17]

>  [15]
и не должно. Delphi умеет арифметику максимум 64-разрядных целых чисел. Если надо больше — надо писать свои процедуры для арифметических действий


 
Плохиш ©   (2010-05-20 17:20) [18]


> MyInteger:TMyInteger;
> N:Integer;
>


> Pointer(N):= Pointer(MyInteger);
>

=
N: Integer Absolute MyInteger;


 
Омлет ©   (2010-05-20 17:26) [19]

Нужна строковая арифметика.


 
РП   (2010-05-20 17:28) [20]

Все понял. Может кто встречал такие функции?


 
RWolf ©   (2010-05-20 17:37) [21]


> РП   (20.05.10 17:28) [20]

http://www.submanifold.be/triade/GInt/gint.html


 
РП   (2010-05-20 18:46) [22]

Про это знаю. А конкретно как сделать перевод..


 
Anatoly Podgoretsky ©   (2010-05-20 19:00) [23]

Допустим 145 193 041 это все таки 9 байт
Допустим, что массив array[0..3] в состоянии хранить только четыре байта.
Сообственно больше и допускать не надо.


 
РП   (2010-05-20 19:22) [24]

Anatoly Podgoretsky  


> Допустим 145 193 041 это все таки 9 байт

145
193
041
Это байты, 3 байта в chr для удобства.


 
Игорь Шевченко ©   (2010-05-20 23:13) [25]

то есть, ты еще и вопросы задавать не умеешь


 
Anatoly Podgoretsky ©   (2010-05-21 07:46) [26]

> РП  (20.05.2010 19:22:24)  [24]

Это хуже, теперь три байта, но зато теперь в массив помещается.


 
Amoeba_   (2010-05-21 18:13) [27]


> Игорь Шевченко ©   (20.05.10 23:13) [25]

+1


 
РП   (2010-05-22 02:36) [28]

а как? как массив из 6-ти байт запихать в число и конвертировать обратно?


 
Германн ©   (2010-05-22 02:51) [29]


> РП   (22.05.10 02:36) [28]
>
> а как? как массив из 6-ти байт запихать в число и конвертировать
> обратно?
>

Да как угодно!
Может наконец опишешь свою задачу?
А то сначала было 3 или 4 байта. Теперь ни с того ни с сего стало 6!


 
0x00FF00   (2010-05-22 03:08) [30]

Мне одному пришли на ум 128-разрядные (сиречь, 16-байтные) регистры SSE? %)


 
Германн ©   (2010-05-22 03:20) [31]


> 0x00FF00   (22.05.10 03:08) [30]
>
> Мне одному пришли на ум 128-разрядные (сиречь, 16-байтные)
> регистры SSE? %)
>

Ты слишком умный. :)


 
РП   (2010-05-22 03:29) [32]

Германн

Задача. Есть 6 байт информации, массив. Нужно этот массив сконвертировать в число и обратно в 6 байт из числа.

type
TMyInteger = array[0..3] of byte;
...
var
MyInteger:TMyInteger;
N:Integer;
...
Pointer(MyInteger):=Pointer(N);

var
MyInteger:TMyInteger;
N:Integer;
begin
MyInteger[0] := 145;
MyInteger[1] := 193;
MyInteger[2] := 041;

Pointer(N):= Pointer(MyInteger);

Этот код делает нечто подобное, но только для 3х байт.


 
Sha ©   (2010-05-22 07:13) [33]

>> Может наконец опишешь свою задачу?
> Нужно этот массив сконвертировать в число и обратно в 6 байт из числа.

Просто ничего не делай.
В твоих 6-ти байтах уже сидит нужный тебе результат.


 
Sha ©   (2010-05-22 07:52) [34]


procedure TForm1.Button1Click(Sender: TObject);
type
 TMy6Bytes= array[0..5] of byte;
 TMyRec= packed record
   a6: TMy6Bytes;
   a2: word;
   end;
 PMyRec= ^TMyRec;
var
 M: TMy6Bytes;
 N: int64;
begin;
 M[0]:=$10;
 M[1]:=$32;
 M[2]:=$54;
 M[3]:=$76;
 M[4]:=$98;
 M[5]:=$ba;
 N:=$fedc000000000000;

 //Туда
 PMyRec(@N).a6:=M;
 Memo1.Lines.Add(IntToHex(N,16));

 FillChar(M,SizeOf(M),0);

 //Сюда
 M:=PMyRec(@N).a6;
 Memo1.Lines.Add(Format("%x %x %x %x %x %x",
   [M[0], M[1], M[2], M[3], M[4], M[5]]));
 end;


 
Anatoly Podgoretsky ©   (2010-05-22 09:01) [35]


> Этот код делает нечто подобное, но только для 3х байт.

Так брать 8 байт неоткуда, максимум 4 байта.


 
РП   (2010-05-22 14:46) [36]

Sha число не в 10-тичной системе. вобще код то что надо?


 
Sha ©   (2010-05-22 14:48) [37]

Не надо - не бери :)


 
РП   (2010-05-22 14:50) [38]

Как просто, массив
M[0]:=$10;
M[1]:=$32;
M[2]:=$54;
M[3]:=$76;
M[4]:=$98;
M[5]:=$ba;

сконвертить в 10тичное число по принципу

type
TMyInteger = array[0..3] of byte;
...
var
MyInteger:TMyInteger;
N:Integer;
...
Pointer(MyInteger):=Pointer(N);

var
MyInteger:TMyInteger;
N:Integer;
begin
MyInteger[0] := 145;
MyInteger[1] := 193;
MyInteger[2] := 041;

Pointer(N):= Pointer(MyInteger);

Этот код делает нечто подобное, но только для 3х байт

var
MyInteger:TMyInteger;
N:Integer;
begin
MyInteger[0] := 145;
MyInteger[1] := 193;
MyInteger[2] := 041;

Pointer(N):= Pointer(MyInteger);


реузльтат: 2736529


 
РП   (2010-05-22 14:52) [39]

Sha твой код выводит

M[0]:=$10;
M[1]:=$32;
M[2]:=$54;
M[3]:=$76;
M[4]:=$98;
M[5]:=$ba;

и этоже в обратном порядке. Это вобще к чему.


 
Sha ©   (2010-05-22 15:00) [40]

> РП   (22.05.10 14:50) [38]


Что такое по-твоему "10тичное число"?


Что значит "сконвертить по принципу"?
Принцип словами сформулируй, чтобы не гадать, что ты имел в виду.


> "Этот код делает нечто подобное".
В угадайку играем? Точно скажи, что надо.


> "реузльтат: 2736529"
Как посчитал?


> твой код выводит
> и этоже в обратном порядке. Это вобще к чему.

А разобраться пробовал?
Каждая строчка в отдельности понятна?
Про целочисленные типы данных в хелпе читал?
Как они располагаются в памяти препод говорил?



Страницы: 1 2 вся ветка

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.074 c
15-1271622604
Юрий
2010-04-19 00:30
2010.08.27
С днем рождения ! 19 апреля 2010 понедельник


15-1270672202
Юрий
2010-04-08 00:30
2010.08.27
С днем рождения ! 8 апреля 2010 четверг


6-1223267358
JohnKorsh
2008-10-06 08:29
2010.08.27
Индикация наличия пакета.


15-1269434373
Незнайка на Луне
2010-03-24 15:39
2010.08.27
Почему все математики сходят с ума?


15-1275596979
Юрий
2010-06-04 00:29
2010.08.27
С днем рождения ! 4 июня 2010 пятница