Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
2 / 2 / 0
Регистрация: 28.01.2012
Сообщений: 99

Чтение данных из буфера

01.08.2012, 02:13. Показов 3863. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите составить функцию чтения данных(изображения) из буфера. Имеется пример функции получения текста.
Delphi
1
2
3
4
5
6
7
8
9
function fReadText(bInBuffer : PAnsiChar; var iOffset : Integer): WideString;
 var iLength : Integer;
begin
    CopyMemory(@iLength, bInBuffer + iOffSet, 4);
    iOffset := iOffset + 4;
    SetLength(Result, iLength);
    CopyMemory(@Result[1], bInBuffer + iOffSet, iLength * 2);
    iOffset := iOffset + iLength * 2;
end;
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.08.2012, 02:13
Ответы с готовыми решениями:

Работа с буфером обмена. Чтение с буфера.
Добрый день , наткнулся при написании кода на такую ошибку... Как решить? ...

TClientSocket. Чтение буфера
Всем привет есть проблема. Сервером клиенту посылается строка. Ясен пень, я могу прочитать её с помощью параметра ReceiveText, но мне...

Запись и чтение данных из буфера обмена
Как массиву присвоить значение из буфера обмена? К примеру у нас есть richTextBox1, и нам нужно присвоить ему текст из буфера обмена.

18
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
01.08.2012, 10:44
Цитата Сообщение от Том стоун Посмотреть сообщение
Имеется пример функции получения текста.
Да и та сомнительна.

Вот с какой такой радости bInBuffer : PAnsiChar, если Result: WideString и при этом в теле функции не фигурируют никакие преобразования кодировки из Ansi в Unicode ?


Цитата Сообщение от Том стоун Посмотреть сообщение
Помогите составить функцию чтения данных(изображения) из буфера
О формате представления данных об изображении в буфере догадываться нужно ?
0
2 / 2 / 0
Регистрация: 28.01.2012
Сообщений: 99
01.08.2012, 10:56  [ТС]
По части примера могу только сказать что он точно работает и используется в библиотеки которая подключается к программе в виде плагина. Изображение будет jpg.
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
01.08.2012, 11:15
Цитата Сообщение от Том стоун Посмотреть сообщение
он точно работает
Да работать-то он может и работает, я же не возражаю, но почему bInBuffer не bInBuffer : PWideChar ? Зачем вводить в заблуждение потенциального пользователя ф-ции, заявляя что в буфере лежат данные в ANSI-кодировке, в то время как на самом деле там юникодовые данные ?)


Цитата Сообщение от Том стоун Посмотреть сообщение
Изображение будет jpg
Примерно так:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function fReadJpegImage(bInBuffer: Pointer; var iOffset: Integer): TJpegImage;
type
  TJpegStream = class(TCustomMemoryStream) end;
var 
  JpegStream: TJpegStream;
begin
  JpegStream := TJpegStream.Create;
  try
    JpegStream.SetPointer(bInBuffer, MAXINT);
    JpegStream.Position := iOffset;
    Result := TJpegImage.Create;
    try
      Result.LoadFromStream(JpegStream);
      iOffset := JpegStream.Position;
    except
      Result.Free;
      raise;
    end;
  finally
    JpegStream.Free;
  end;
end;
0
2 / 2 / 0
Регистрация: 28.01.2012
Сообщений: 99
01.08.2012, 11:40  [ТС]
После получения данных должна использоваться функция пере конвертации. У меня есть пример на C.
C++
1
2
3
4
5
6
7
8
9
10
void __fastcall fAnsiToJPEG(AnsiString *aSource,TJPEGImage * jpg)
{
TMemoryStream * ms1 = new TMemoryStream;
ms1->Write((*aSource).c_str(),(*aSource).Length());
ms1->Position = 0;
 
jpg->LoadFromStream(ms1);
 
delete ms1;
}
Который я попробовал перевести на Delphi.
Delphi
1
2
3
4
5
6
7
8
9
function fAnsiToJPEG(var aSource:AnsiString):TJPEGImage;
var ms1: TMemoryStream;
begin
ms1:= TMemoryStream.Create;
ms1.Write(aSource, Length(aSource));
ms1.Position:= 0;
Result.LoadFromStream(ms1);
ms1.Destroy;
end;
Я так так и не могу его опробовать поскольку ещё не смог получить данные! Ваша функция явно не подходит. Прошу составить новую функцию с учётом новой информации.
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
01.08.2012, 12:07
Цитата Сообщение от Том стоун Посмотреть сообщение
с учётом новой информации
Да бред же какой-то) ..

Какое отношение входная Ansi-кодированная текстовая строка имеет якобы содержащемуся в ее буфере Jpeg-форматированным данным ?
Как вообще в Ansi-строковый буфер попали данные совершенно иного рода ?

Нет ну извратиться конечно можно, но зачем ?
Почему входной буфер заявлен именно как AnsiString, а не как любого типа (или даже нетипизированный) указатель ?

Добавлено через 6 минут
Цитата Сообщение от Том стоун Посмотреть сообщение
Ваша функция явно не подходит
Чего это вдруг ?

Есть адрес первого байта буфера bInBuffer, есть смещение в буфере iOffset, по которому буфере ожидается очередной корректный блок jpeg-кодированных данных .. Т.е. все в точности так ты заявил изначально ..

И чем же она при этом "явно не подходит" ?)
0
2 / 2 / 0
Регистрация: 28.01.2012
Сообщений: 99
01.08.2012, 12:22  [ТС]
Она не подходит потому что я её попытался применить. Возможно я что то упустил. Еще нужно получить величину размера данных (в байтах). Если честно я могу не очень точно информировать! Вот пост откуда я брал информацию http://commfort.com/ru/forum/v... =35&t=7799 Надеюсь на понимание!
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
01.08.2012, 12:42
Цитата Сообщение от Том стоун Посмотреть сообщение
пост откуда я брал информацию http://commfort.com/ru/forum/v... =35&t=7799 Надеюсь на понимание
Так ведь и там тоже не понимают с какого дуба рухнули типы AnsiString и PAnsiChar в твою задачу с буфером, содержащем изображени[е|я] !)


Цитата Сообщение от Том стоун Посмотреть сообщение
нужно получить величину размера данных
Откуда получить-то ?

В твоем топикстарте в примере функции получения текста, который ты пожелал заточить под получение изображения, нет ни намека на размер данных буфере.

Так я тебе и заточил функцию с точно такими же заявленными тобой же условиями - размер буфера заранее неизвестен, но известна позиция в буфере, начиная с которой в нем ожидаются jpeg-кодированные данные...

Какой тебе еще размер-то нужен ? Этих самых данных, которые функция прочитает из буфера за один вызов что ли ? Ну так просто вычисли разность между значениями параметра iOffset после и до вызова функции - вот и будет тебе размер очередных прочитанных из буфера jpeg-данных..
0
2 / 2 / 0
Регистрация: 28.01.2012
Сообщений: 99
01.08.2012, 12:50  [ТС]
Если уж из перво источника нечего непонятно то я просто не знаю. Может быть кинуть весь код плагина?
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
unit main;
 
interface
 
uses windows, Classes, SysUtils, Dialogs, inifiles, ShellAPI, Graphics, Controls,
  StdCtrls, Variants, DB, ExtCtrls, DBCtrls, Grids, JPEG;
 
type
  TCommFortProcess = procedure(dwPluginID : DWORD; dID: DWORD; bOutBuffer : PAnsiChar; dwOutBufferSize : DWORD); stdcall;
  TCommFortGetData = function(dwPluginID : DWORD; dwID : DWORD; bInBuffer : PAnsiChar; dwInBufferSize : DWORD; bOutBuffer : PAnsiChar; dwOutBufferSize : DWORD): DWORD; stdcall;
  TJpegStream = class(TCustomMemoryStream);
 
function  PluginStart(dwThisPluginID : DWORD; func1 : TCommFortProcess; func2 : TCommFortGetData) : Integer; cdecl; stdcall;
procedure PluginStop(); cdecl; stdcall;
procedure PluginShowOptions(); cdecl; stdcall;
procedure PluginShowAbout(); cdecl; stdcall;
procedure PluginProcess(dwID : DWORD; bInBuffer : PAnsiChar; dwInBufferSize : DWORD); cdecl; stdcall;
function  PluginGetData(dwID : DWORD; bInBuffer : PAnsiChar;
            dwInBufferSize : DWORD; bOutBuffer : PAnsiChar; dwOutBufferSize : DWORD): DWORD; cdecl; stdcall;
 
function  fReadInteger(bInBuffer : PAnsiChar; var iOffset : Integer): Integer;
function  fReadText(bInBuffer : PAnsiChar; var iOffset : Integer): WideString;
procedure fWriteInteger(var bOutBuffer : PAnsiChar; var iOffset  : Integer; iValue : Integer);
procedure fWriteText(bOutBuffer : PAnsiChar; var iOffset  : Integer; uValue : WideString);
function  fTextToAnsiString(uText : WideString) : AnsiString;
function  fIntegerToAnsiString(iValue : Integer) : AnsiString;
 
exports PluginStart, PluginStop, PluginProcess, PluginGetData, PluginShowOptions, PluginShowAbout;
 
implementation
 
var
 
  { GLOBAL VARIABLES }
 
  dwPluginID : DWORD;
  CommFortProcess : TCommFortProcess;
  CommFortGetData : TCommFortGetData;
    Ver , WhenLoaded , WhenExecuted,  vopro : String;
  ResultStart , ServerState: Integer;
 
  FilterPos , DoIt , TxtFile , Info , MessInfo, f2, pust : String;
 
//---------------------------------------------------------------------------
function fReadInteger(bInBuffer : PAnsiChar; var iOffset : Integer): Integer; //вспомогательная функция для упрощения работы с чтением данных
begin
    CopyMemory(@Result, bInBuffer + iOffSet, 4);
    iOffset := iOffset + 4;
end;
 
 
//---------------------------------------------------------------------------
procedure fWriteInteger(var bOutBuffer : PAnsiChar; var iOffset  : Integer; iValue : Integer); //вспомогательная функция для упрощения работы с записью данных
begin
    CopyMemory(bOutBuffer + iOffSet, @iValue, 4);
    iOffset := iOffset + 4;
end;
//---------------------------------------------------------------------------
procedure fWriteText(bOutBuffer : PAnsiChar; var iOffset  : Integer; uValue : WideString); //вспомогательная функция для упрощения работы с записью данных
    var iLength : Integer;
begin
    iLength := Length(uValue);
    CopyMemory(bOutBuffer + iOffset, @iLength, 4);
    iOffset := iOffset + 4;
 
    CopyMemory(bOutBuffer + iOffSet, @uValue[1], iLength * 2);
    iOffset := iOffset + iLength * 2;
end;
 
//---------------------------------------------------------------------------
function fTextToAnsiString(uText : WideString) : AnsiString; //вспомогательная функция для упрощения работы с данными
    var iLength : Integer;
begin
    //функция предназначена для ознакомительных целей,
    //не рекомендуется для реального применения,
    //так как при ее использовании проявляется избыточное копирование данных
    iLength := Length(uText);
 
    SetLength(Result, 4 + iLength * 2);
 
    CopyMemory(@Result[1], @iLength, 4);
    CopyMemory(PAnsiChar(Result) + 4, @uText[1], iLength * 2);
end;
//---------------------------------------------------------------------------
function fIntegerToAnsiString(iValue : Integer) : AnsiString; //вспомогательная функция для упрощения работы с данными
begin
    //функция предназначена для ознакомительных целей,
    //не рекомендуется для реального применения,
    //так как при ее использовании проявляется избыточное копирование данных
 
    SetLength(Result, 4);
    CopyMemory(@Result[1], @iValue, 4);
end;
 
 
//---------------------------------------------------------------------------
function PluginStart(dwThisPluginID : DWORD; func1 : TCommFortProcess; func2 : TCommFortGetData) : Integer;
 
var
  filename , FilterposFromIni: String;
  myFile   : TextFile;
begin
 
 
    dwPluginID := dwThisPluginID;
    //При инициализации планину присваивается уникальный идентификатор
    //его необходимо обязательно сохранить, и указывать
    //в качестве первого параметра при инициировании событий
    CommFortProcess := func1;
        //указываем функцию обратного вызова,
    //с помощью которой плагин сможет инициировать события
 
    CommFortGetData := func2;
        //указываем функцию обратного вызова,
    //с помощью которой можно будет запрашивать необходимые данные от программы
 
 
    //Возвращаемые значения:
    //TRUE - запуск прошел успешно
    //FALSE - запуск невозможен
    Result := Integer(TRUE);
end;
 
 
 
//---------------------------------------------------------------------------
procedure PluginStop();
begin
    //данная функция вызывается при завершении работы плагина
end;
 
 
//---------------------------------------------------------------------------
procedure PluginProcess(dwID : DWORD; bInBuffer : PAnsiChar; dwInBufferSize : DWORD);
var iReadOffset, msgtype, icon, n : Integer;
aDataToSend : AnsiString;
user, ip, chanel, msgtxt, vopros, msgtxt1: WideString;
  int   : Integer;
    jp :   TJpegImage;
begin
iReadOffset := 0;
if (dwID = 10) then
begin
//получаем инфу о сообщении в приват
iReadOffset := 0;
user := fReadText(bInBuffer, iReadOffset);// !user
ip := fReadText(bInBuffer, iReadOffset);// !ip
icon := fReadInteger(bInBuffer, iReadOffset);// !icon
msgtype := fReadInteger(bInBuffer, iReadOffset);// !msgtype
msgtxt := fReadText(bInBuffer, iReadOffset);// !text
 
 
 
 
 
 
 
 
end;
end;
 
 
//---------------------------------------------------------------------------
 
function PluginGetData(dwID : DWORD; bInBuffer : PAnsiChar; dwInBufferSize : DWORD; bOutBuffer : PAnsiChar; dwOutBufferSize : DWORD): DWORD;
var iWriteOffset, iSize : Integer; //вспомогательные переменные для упрощения работы с блоком данных
    uName : WideString;
begin
 
      //функция передачи данных программе
    iWriteOffset := 0;
 
    //при значении dwOutBufferSize равным нулю функция должна вернуть объем данных, ничего не записывая
 
    if (dwID = 2800) then //предназначение плагина
    begin
        if (dwOutBufferSize = 0) then
            Result := 4 //объем памяти в байтах, которую необходимо выделить программе
        else
        begin
            fWriteInteger(bOutBuffer, iWriteOffset, 2); //плагин подходит только для клиента
            Result := 4;//объем заполненного буфера в байтах
        end;
    end
    else
    if (dwID = 2810) then //название плагина (отображается в списке)
    begin
        uName := 'kisa';//название плагина
        iSize := Length(uName) * 2 + 4;
 
        if (dwOutBufferSize = 0) then
            Result := iSize //объем памяти в байтах, которую необходимо выделить программе
        else
        begin
            fWriteText(bOutBuffer, iWriteOffset, uName);
            Result := iSize;//объем заполненного буфера в байтах
        end;
    end
    else
        Result := 0;//возвращаемое значение - объем записанных данных
end;
 
//---------------------------------------------------------------------------
procedure PluginShowOptions();
 
begin
 
end;
 
//---------------------------------------------------------------------------
procedure PluginShowAbout();
begin
    //данная функция вызывается при нажатии кнопки "О плагине" в списке плагинов
 
end;
 
 
 
 
end.
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
01.08.2012, 13:10
Цитата Сообщение от Том стоун Посмотреть сообщение
я просто не знаю
А уж я тем более не знаю, зачем тебе понадобился размер прочитанных из буфера jpeg-данных..
Ни одна из fRead-функций в тексте приведенного тобой плагина не возвращает размер прочитанных данных, а для fReadJpegImage он вдруг стал нужен ..

Ну возьми да модифицируй ее так, если уж надо :

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function fReadJpegImage(bInBuffer: Pointer; var iOffset: Integer; out iSize: Integer): TJpegImage;
type
  TJpegStream = class(TCustomMemoryStream) end;
var 
  JpegStream: TJpegStream;
begin
  JpegStream := TJpegStream.Create;
  try
    JpegStream.SetPointer(bInBuffer, MAXINT);
    JpegStream.Position := iOffset;
    Result := TJpegImage.Create;
    try
      Result.LoadFromStream(JpegStream);
      iSize := JpegStream.Position - iOffset; // <- вот он, размер ..
      iOffset := JpegStream.Position;      
    except
      Result.Free;
      raise;
    end;
  finally
    JpegStream.Free;
  end;
end;
0
2 / 2 / 0
Регистрация: 28.01.2012
Сообщений: 99
01.08.2012, 13:13  [ТС]
Просто по инструкции "То есть после чтения текста сообщения ([image]) необходимо будет считать 4 байта - размер данных и далее сами данные JPEG изображения. Если данные в TMemoryStream, то для конвертации к TImage нужно выполнить следующее:"
C++
1
2
3
4
5
6
7
TJPEGImage * j1 = new TJPEGImage;
 
j1->LoadFromStream(MemoryStream1);
 
Image1->Picture->Assign(j1);
 
delete j1;
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
01.08.2012, 13:51
Цитата Сообщение от Том стоун Посмотреть сообщение
по инструкции "То есть после чтения текста сообщения ([image]) необходимо будет считать 4 байта - размер данных и далее сами данные JPEG изображения
Ах вон оно что..

Ну даже если так, то размер этот не нужен, разве что для сверки - его можно смело пропустить, скорректировав соответственно позицию в буфере:

function fReadJpegImage(bInBuffer: Pointer; var iOffset: Integer): TJpegImage;
type
TJpegStream = class(TCustomMemoryStream) end;
var
JpegStream: TJpegStream;
begin
JpegStream := TJpegStream.Create;
try
JpegStream.SetPointer(bInBuffer, MAXINT);
JpegStream.Position := iOffset + 4; // коррекция смещения
Result := TJpegImage.Create;
try
Result.LoadFromStream(JpegStream);
iOffset := JpegStream.Position;
except
Result.Free;
raise;
end;
finally
JpegStream.Free;
end;
end;


Если в буфере после 4-х байт размера данных об jpeg-кодированном изображении действительно следует корректное (по размеру и правилам кодирования) изображение , то ф-ция вернет корректный TJpegImage-объект с прочитанной из буфера картинкой, в противном случае возбудит исключение, которое говорит о принципиальной бессмысленности последующего (т.е. после неуспешной попытки чтения изображения) чтения и интерпретации содержимого буфера. Т.е. нарушен протокол информационного обмена мехду плагином и хостом.

Добавлено через 12 минут
Либо, если таки задействовать префикс размера, так:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function fReadJpegImage(bInBuffer: PByte; var iOffset: Integer): TJpegImage;
type
  TJpegStream = class(TCustomMemoryStream) end;
var
  JpegStream: TJpegStream;
  DataSize: DWord;
begin
  JpegStream := TJpegStream.Create;
  try
    DataSize := PDWORD(bInBuffer)^;
    Inc(bInBuffer, SizeOf(DWord))
    JpegStream.SetPointer(bInBuffer, DataSize);
    Result := TJpegImage.Create;
    try
       Result.LoadFromStream(JpegStream);
       Inc(iOffset, DataSize);
    except
       Result.Free;
       raise;
    end;
  finally
    JpegStream.Free;
  end;
end;
Но так или иначе нет никакого резона задействовать TMemoryStream без явной на то нужды.
0
2 / 2 / 0
Регистрация: 28.01.2012
Сообщений: 99
01.08.2012, 13:59  [ТС]
Первая функция наработает и ошибка по которой она вылетает я назвать не могу. Поскольку программа просто останавливает плагин. Вторую я не могу применить из bInBuffer: PByte так как в функцию передается bInBuffer : PAnsiChar
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
01.08.2012, 14:09
Цитата Сообщение от Том стоун Посмотреть сообщение
Первая функция наработает и ошибка по которой она вылетает я назвать не могу
Можешь и не называть - и так понятно что первоначальный вариант не учитывает факт наличия в буфере префикса размера jpeg-данных, ибо на тот момент ты ничего не сказал об оном факте.


Цитата Сообщение от Том стоун Посмотреть сообщение
Вторую я не могу применить из bInBuffer: PByte так как в функцию передается bInBuffer : PAnsiChar
Еще как можешь.
Ну возьми да измени PByte на PAnsiChar, если уж совсем не можешь)
0
2 / 2 / 0
Регистрация: 28.01.2012
Сообщений: 99
01.08.2012, 14:30  [ТС]
Нечего не получилось. Можно пример с TMemoryStream
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
01.08.2012, 14:41
Цитата Сообщение от Том стоун Посмотреть сообщение
Нечего не получилось
Прискорбно.
0
2 / 2 / 0
Регистрация: 28.01.2012
Сообщений: 99
01.08.2012, 14:47  [ТС]
На том форме программы где за эти плагины общаются. Некто не может дать рабочий пример. Ну это и понятно что некому не нужно получать картинку это просто можно сказать ненужная функционал плагина. Поэтому некто и не пытался. А мне это нужно но походу некто помочь не может.
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
01.08.2012, 15:01
Помощь ты получил. Вполне предметную.
А то что ты не смог или не захотел ею воспользоваться - вот это как раз и есть "походу".
0
2 / 2 / 0
Регистрация: 28.01.2012
Сообщений: 99
01.08.2012, 15:02  [ТС]
Да я и сам вижу что код вроде правильный! Ладно буду глумится спасибо за помощь!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.08.2012, 15:02
Помогаю со студенческими работами здесь

Чтение текстовых данных из буфера обмена
нужно прочитать из буфера обмена текстовые данные - DocVar= &quot;текстовое значение&quot;, чтобы затем использовать &quot;текстовое значение&quot;...

Чтение данных из буфера печати (spoolsv) Как?
Всем доброго времени суток. Есть агромадная потребность прочитать данные, отправленные на печать. Напрямую из порта прочитать не...

Чтение данных из дескриптора сокета без создания нового буфера
Для чтения данных из сокета например с помощью функции read или recv нужно создать буфер и передать этот буфер одной из этих функций, и...

Чтение из буфера
есть char Buffer; нужно с помощью printf вывести на экран содержимое буфера в 16-ой системе счисления!

Чтение буфера клавиатуры
Как на c# вывести содержимое буфера клавиатуры(как в unsafe прочитать содержимое по адресу в памяти) Можно использовать чтение...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru