![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Байты в число и число в байты нужной размерности
РП © (2010-05-20 16:37:00)Допустим:
байты: 145 193 041равны числу 19410
type
TMyInteger = array[0..3] of byte;
...
var
MyInteger:TMyInteger;
N:Integer;
...
Pointer(MyInteger):=Pointer(N);
Как можно таким образом преобразовать 10 байт в число, допустим записать его в строку. И обратно из этого числа в 10 байт.
Sha (2010-05-22 16:32:00) [1]см [34]
РП (2010-05-22 16:12:00) [2]да как больше
Sha (2010-05-22 15:57:00) [3]> тут максимум 3 байта можно конвертить.
4
РП (2010-05-22 15:12:00) [4]это да, вот вернее.
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:11:00) [5]Ты понимаешь, что твой код работает с "лишним" байтом?
РП (2010-05-22 15:03:00) [6]Вот код, берем 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:00:00) [7]> РП (22.05.10 14:50) [38]
Что такое по-твоему "10тичное число"?
Что значит "сконвертить по принципу"?
Принцип словами сформулируй, чтобы не гадать, что ты имел в виду.
> "Этот код делает нечто подобное".
В угадайку играем? Точно скажи, что надо.
> "реузльтат: 2736529"
Как посчитал?
> твой код выводит
> и этоже в обратном порядке. Это вобще к чему.
А разобраться пробовал?
Каждая строчка в отдельности понятна?
Про целочисленные типы данных в хелпе читал?
Как они располагаются в памяти препод говорил?
РП (2010-05-22 14:52:00) [8]Shaтвой код выводит
M[0]:=$10;
M[1]:=$32;
M[2]:=$54;
M[3]:=$76;
M[4]:=$98;
M[5]:=$ba;
и этоже в обратном порядке. Это вобще к чему.
РП (2010-05-22 14:50:00) [9]Как просто, массив
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
Sha (2010-05-22 14:48:00) [10]Не надо - не бери :)
РП (2010-05-22 14:46:00) [11]Shaчисло не в 10-тичной системе. вобще код то что надо?
Anatoly Podgoretsky (2010-05-22 09:01:00) [12]
> Этот код делает нечто подобное, но только для 3х байт.
Так брать 8 байт неоткуда, максимум 4 байта.
Sha (2010-05-22 07:52:00) [13]
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;
Sha (2010-05-22 07:13:00) [14]>> Может наконец опишешь свою задачу?
> Нужно этот массив сконвертировать в число и обратно в 6 байт из числа.
Просто ничего не делай.
В твоих 6-ти байтах уже сидит нужный тебе результат.
РП (2010-05-22 03:29:00) [15]Германн
Задача. Есть 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х байт.
Германн (2010-05-22 03:20:00) [16]
> 0x00FF00 (22.05.10 03:08) [30]
>
> Мне одному пришли на ум 128-разрядные (сиречь, 16-байтные)
> регистры SSE? %)
>
Ты слишком умный. :)
0x00FF00 (2010-05-22 03:08:00) [17]Мне одному пришли на ум 128-разрядные (сиречь, 16-байтные) регистры SSE? %)
Германн (2010-05-22 02:51:00) [18]
> РП (22.05.10 02:36) [28]
>
> а как? как массив из 6-ти байт запихать в число и конвертировать
> обратно?
>
Да как угодно!
Может наконец опишешь свою задачу?
А то сначала было 3 или 4 байта. Теперь ни с того ни с сего стало 6!
РП (2010-05-22 02:36:00) [19]а как? как массив из 6-ти байт запихать в число и конвертировать обратно?
Amoeba_ (2010-05-21 18:13:00) [20]
> Игорь Шевченко © (20.05.10 23:13) [25]
+1