Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
РП   (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"
Как посчитал?


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

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


 
РП   (2010-05-22 15:03) [41]

Вот код, берем 3 байта, переделываем в число 2736529 и второй батон конвертируем обратно в 3 байта. Но как для 6-ти сделать тожсамое.
procedure TForm1.Button2Click(Sender: TObject);
var
MyInteger:TMyInteger;
N:Integer;
begin
MyInteger[0] := 145;
MyInteger[1] := 193;
MyInteger[2] := 041;

Pointer(N):= Pointer(MyInteger);
memo1.Lines.add(inttostr(N));
end;

procedure TForm1.Button3Click(Sender: TObject);
var
MyInteger:TMyInteger;
N,h:Integer;
begin
Pointer(MyInteger):=Pointer(2736529);
for h:=0 to 2 do
memo1.Lines.Add(inttostr(MyInteger[h]));
end;


 
Sha ©   (2010-05-22 15:11) [42]

Ты понимаешь, что твой код работает с "лишним" байтом?


 
РП   (2010-05-22 15:12) [43]

это да, вот вернее.

procedure TForm1.Button2Click(Sender: TObject);
var
MyInteger:TMyInteger;
N:integer;
begin
MyInteger[0] := 145;
MyInteger[1] := 193;
MyInteger[2] := 041;
MyInteger[3] := 031;

Pointer(N):= Pointer(MyInteger);
memo1.Lines.add(inttostr(N));
end;

procedure TForm1.Button3Click(Sender: TObject);
var
MyInteger:TMyInteger;
N,h:integer;
begin
Pointer(MyInteger):=Pointer(522830225);
for h:=0 to 3 do
memo1.Lines.Add(inttostr(MyInteger[h]));
end;


все же у меня в этом вопрос. тут максимум 3 байта можно конвертить.


 
Sha ©   (2010-05-22 15:57) [44]

> тут максимум 3 байта можно конвертить.

4


 
РП   (2010-05-22 16:12) [45]

да как больше


 
Sha ©   (2010-05-22 16:32) [46]

см [34]



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

Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.054 c
2-1268734595
MAcKZloy
2010-03-16 13:16
2010.08.27
ошибка в CBLRTSS.DLL


15-1271132872
oldman
2010-04-13 08:27
2010.08.27
«РИФ+КИБ 2010»: общая информация


2-1274259171
Nathan
2010-05-19 12:52
2010.08.27
Работа с файлами


2-1267693170
00110011
2010-03-04 11:59
2010.08.27
раздел const


2-1265871705
Amir
2010-02-11 10:01
2010.08.27
Не отображаются визуальные компоненты формы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский