[image]

Си. Преобразование из массива char в int.

 
1 2 3 4 5
Вопрос наверное простой,
имеется массив char[n]. Как получить из него переменную типа uint, где LSB=char[m], MSB=char[m+1]? Пока единственное что получается, это uint var=((uint)char[m+1]<<8)|((uint)char[m]);
Но чисто с точки зрения логики было бы быстрее просто поставить указатель переменной uint var на позицию char[m] только можно ли так сделать в Си?
   7.0.17.0.1
US Сергей-4030 #06.12.2011 20:20  @GOGI#06.12.2011 20:06
+
-
edit
 

Сергей-4030

исключающий третье
★★
GOGI> Вопрос наверное простой,
GOGI> имеется массив char[n]. Как получить из него переменную типа uint, где LSB=char[m], MSB=char[m+1]? Пока единственное что получается, это uint var=((uint)char[m+1]

Конечно. В Си вся такая фигня делается на раз. Правда, делать так НЕ НАДО!!! Еще раз - НЕ НАДО!!! И в третий раз - НЕ НАДО! То есть, вот так:

char * str = malloc(sizeof(char));
str[0]=1;
str[1]=2;

int * istr = (int*) str;
printf("%d", istr[0]);

делать можно спокойно. Но не надо.

Ты ведь только в порядке самообразования, правильно? Так вот, в порядке самообразования - всегда приводи типы явно. Если уж тебе неймется, лучше наоборот делать, иметь массив uint и из него извлекать lo/hibyte.

Еще есть цирк с union, но я даже рассказывать не буду, потому что это отстой. Полнейший отстой. Нет таких задач, на которых ты получишь на нынешних процессорах какую-то хоть сколько-то заметную выгоду от такого бреда. И вообще, C - отстой, брось бяку. Java, С#, на худой конец C++. Но не C. С умерло, не будь некрофилом.
   15.0.874.12115.0.874.121
US Сергей-4030 #06.12.2011 20:32  @Сергей-4030#06.12.2011 20:20
+
-
edit
 

Сергей-4030

исключающий третье
★★
Ты, надо полагать, делаешь ввод данных какой-то, ага? Ввод данных делается так (и только так, всякая чушь со считыванием структуры целиком - для лохов) ;)

code text
  1. typedef struct _data {
  2.    int start;
  3.    long middle;
  4.    char finish;
  5. } data;
  6.  
  7.  
  8. data read(stream str) {
  9.    data *d = new data();
  10.    d->start = str.readInt();
  11.    d->middle = str.readLong();
  12.    d->finish = str.readChar();
  13.    return d;
  14. }


Вот это - правильно и хорошо и как надо делать. Будешь так делать - сэкономишь много времени и нервных клеток.

А страдать со считыванием целиком структуры или тем более со считыванием в массив байт и потом выкусыванием полей - это неправильно.
   15.0.874.12115.0.874.121
RU GOGI #06.12.2011 20:41  @Сергей-4030#06.12.2011 20:20
+
-
edit
 
>И вообще, C - отстой, брось бяку. Java, С#, на худой конец C++. Но не C. С умерло, не будь некрофилом.
Сергей, это для микроконтроллера, тут выбора нет на чем писать. Ну и "правильное" программирование не всегда возможно ввиду ограниченности ресурсов.
А для компьютера я VB.net использую
   7.0.17.0.1
US Сергей-4030 #06.12.2011 22:20  @GOGI#06.12.2011 20:41
+
-
edit
 

Сергей-4030

исключающий третье
★★
GOGI> Сергей, это для микроконтроллера, тут выбора нет на чем писать. Ну и "правильное" программирование не всегда возможно ввиду ограниченности ресурсов.

Даже для микроконтроллера, ты сэкономишь пустяки. Впрочем, ответ, как ты уже понял - "да", ты можешь приводить ссылку на такой-то тип к ссылке на любой другой тип. Но это плохо.

Ну и юнионы тоже можно использовать, конечно.

code text
  1. typedef struct _twobytes {
  2.    char lobyte;
  3.    char hibyte;
  4. } twobytes;
  5.  
  6. typedef union _number {
  7.    int number;
  8.    twobytes bytes;
  9. } number;
  10.  
  11. number array* = alloc(sizeof(number));
  12.  
  13. array[0].bytes.lobyte = 1;
  14. array[0].bytes.hibyte = 2;
  15.  
  16. printf("%d", array[0].number);


Если тебе обязательно надо приводить типы таким образом, так вроде как почище получается. Причем скомпилированный код будет вполне эффективным, хотя кажется, что сложнее и компилятор не сообразит, как надо.
   15.0.874.12115.0.874.121

Anika

координатор
★★☆
GOGI> Сергей, это для микроконтроллера, тут выбора нет на чем писать.
Что за контроллер, какого класса - AVR, ARM, PIC?
А насчёт извратов с конверсией массивов - я с Сергеем согласен. Нах-нах эти радости.
Вот Си он рановато хоронит. Ну да ладно ;)
   
RU GOGI #06.12.2011 22:50  @Сергей-4030#06.12.2011 20:32
+
-
edit
 
Сергей-4030> Ты, надо полагать, делаешь ввод данных какой-то, ага? Ввод данных делается так (и только так, всякая чушь со считыванием структуры целиком - для лохов) ;)
Тогда вопрос, как правильно организовать ввод (и вывод) в разного размера структуры, если физически на входе и выходе всегда последовательность чтений или записи 8 битного регистра? То есть чтение это N раз регистр прочитали (и меньше чем N нельзя) и запись аналогично. Я везде вижу только тупо заполнение массива char.
   7.0.17.0.1

Anika

координатор
★★☆
GOGI> AVR Чтение массива по SPI.
Ясенько. Ну так в Кодвижене на ассемблер перейти - полпинка: регистр туда, регистр сюда...
   
Anika> Ясенько. Ну так в Кодвижене на ассемблер перейти - полпинка: регистр туда, регистр сюда...
Я на IAR, но не суть. Понятно, что на асме это легко и просто, но смысл тогда вообще на Си писать :) Если я ему сам все распишу что, куда, это ж рабство какое-то.
   7.0.17.0.1

Mishka

модератор
★★★
GOGI> AVR Чтение массива по SPI.
Тогда надо поставить задачу конкретнее, т.к. требуется знание протокла SPI (побайтовый? А какой байт передаётся первым — самый значимый или наоборот? какие числа — битовая разрядность?), особенности архитектуры процессора (Little Endian, Big Endian)?

В принципе, на нижнем уровне у сетевиков такие задачи возникают постоянно. Поэтому даже разные С-шные библиотеки есть. ntoa, aton, pton, hton, ntoh и прочие. Но не думаю, что на микроконтролллере доступна сетевая библиотека. Лучший вариант с union и указателем на него.
   7.0.17.0.1

Mishka

модератор
★★★
GOGI> Я на IAR, но не суть. Понятно, что на асме это легко и просто, но смысл тогда вообще на Си писать :) Если я ему сам все распишу что, куда, это ж рабство какое-то.
В принципе на С надо делать то же самое. Рабство. Но такова жизнь на нижнем уровне. И на Java тоже придётся всё ручками расписать.
   7.0.17.0.1

Mishka

модератор
★★★
GOGI> Тогда вопрос, как правильно организовать ввод (и вывод) в разного размера структуры, если физически на входе и выходе всегда последовательность чтений или записи 8 битного регистра? То есть чтение это N раз регистр прочитали (и меньше чем N нельзя) и запись аналогично. Я везде вижу только тупо заполнение массива char.

А у тебя возможных интерпретаций этих потоков 8 битных значений много? А число N какие значения может принимать?
   7.0.17.0.1

Anika

координатор
★★☆
GOGI> Понятно, что на асме это легко и просто, но смысл тогда вообще на Си писать :) Если я ему сам все распишу что, куда, это ж рабство какое-то.
А всё-то эачем расписывать? Расписать проблемный фрагмент, и ладушки, а прочее оставить на Сях ;)
   
Mishka> А у тебя возможных интерпретаций этих потоков 8 битных значений много? А число N какие значения может принимать?
Да, нет, не много. N Фиксированно 512 (сектор с диска). Первое это FAT32 Boot Record, причем мне всю не надо, только некоторые, но не подряд идущие поля, потом просто массив байт и массив uint.
   7.0.17.0.1
US Сергей-4030 #06.12.2011 23:26  @GOGI#06.12.2011 23:16
+
-
edit
 

Сергей-4030

исключающий третье
★★
Mishka>> А у тебя возможных интерпретаций этих потоков 8 битных значений много? А число N какие значения может принимать?
GOGI> Да, нет, не много. N Фиксированно 512 (сектор с диска). Первое это FAT32 Boot Record, причем мне всю не надо, только некоторые, но не подряд идущие поля, потом просто массив байт и массив uint.

Ну, если такая низкоуровщина, то тогда, конечно, придется извращаться. Что-нибудь такое:

char *buffer = read_MBR();

int some_int_parm = *( (int*) (buffer+26) );
long some_long_parm = *( (long*) (buffer+30) );
   15.0.874.12115.0.874.121
US Сергей-4030 #06.12.2011 23:39  @Сергей-4030#06.12.2011 23:26
+
-
edit
 

Сергей-4030

исключающий третье
★★
Сергей-4030> char *buffer = read_MBR();
Сергей-4030> int some_int_parm = *( (int*) (buffer+26) );
Сергей-4030> long some_long_parm = *( (long*) (buffer+30) );

Хотя, конечно, тут уже надо смотреть. Может, правильно сделать так:
code text
  1. char * MBR;
  2. int pos;
  3.  
  4. void initMBR() {
  5.    MBR = readMBR();
  6.    pos = 0;
  7. }
  8.  
  9. int readInt() {
  10.    #ifdef DEBUG
  11.        if(pos>mbr_size-2)
  12.           fatal("Memory overflow");
  13.    #endif
  14.    int rez = *( (int*) MBR + pos );
  15.    #ifdef DEBUG
  16.        if(doesntSeemRight(rez))
  17.           fatal("Shit happens.");
  18.    #endif
  19.    pos+=2;
  20.    return rez;
  21. }
  22.  
  23. int readInt(int offset) {
  24.    pos = offset;
  25.    return readInt();
  26. }
  27.  
  28. int readLong() {
  29.    long rez = *( (long*) MBR + pos );
  30.    pos+=4;
  31.    return rez;
  32. }
  33.  
  34. int readLong(int offset) {
  35.    pos = offset;
  36.    return readLong();
  37. }
  38.  
  39. void process() {
  40.     initMBR();
  41.     int parm1=readInt();    
  42.     int parm2=readInt();    
  43.     long parm3=readLong();    
  44.     long parm4 = readInt(parm2);
  45. }


Наверное, тебе покажется это излишним, но я думаю, что если твоя задача примерно такая, эти методы написать очень даже стоит.
   15.0.874.12115.0.874.121

Mishka

модератор
★★★
GOGI> Да, нет, не много. N Фиксированно 512 (сектор с диска). Первое это FAT32 Boot Record, причем мне всю не надо, только некоторые, но не подряд идущие поля, потом просто массив байт и массив uint.

А какая именно FAT32? Если WIN4.1, то она немного отличается. И какая архитектура у AVR — LE или BE. Тут подводный камень лежит. Скажем, Mega8515 and Mega162 имеют LE, поэтому не надо дополнительной обмены байтами в словах (2 байта) и двойных словах (4-е байта).

code c
  1. #include <stdio.h>
  2.  
  3. /* assumption: 32 bit compiler */
  4. typedef char               byte;
  5. typedef unsigned char      ubyte;
  6. typedef short int          word;
  7. typedef unsigned short int uword;
  8. typedef int                dword;
  9. typedef unsigned int       udword;
  10.  
  11.  
  12. /* turn off alignment! structure should be packed! */
  13. /* usually pragma works but it's compiler dependent! */
  14. /* this works with gcc */
  15. #pragma pack( push, 1 )
  16.  
  17. struct _BIOS_PARAMETER_BLOCK
  18. {
  19.   uword  bytesPerSector;
  20.   ubyte  sectorPerCluster;
  21.   uword  reservedSectors;
  22.   ubyte  numberOfFATs;
  23.   uword  rootEntries;
  24.   uword  totalSectors;
  25.   ubyte  mediaDescriptor;
  26.   uword  sectorsPerFAT;
  27.   uword  sectorsPerTrack;
  28.   uword  heads;
  29.   udword hiddenSectors;
  30.   udword bigTotalSectors;
  31.   udword bigSectorsPerFat;
  32.   uword  extFlags;
  33.   uword  FS_Version;
  34.   udword rootDirStrtClus;
  35.   uword  FSInfoSec;
  36.   uword  bkUpBootSec;
  37.   uword  reserved[ 6 ];
  38. };
  39. typedef  struct _BIOS_PARAMETER_BLOCK BIOS_PARAMETER_BLOCK;
  40.  
  41. struct _FAT32_BOOT
  42. {
  43.   ubyte                jump[ 3 ];
  44.   ubyte                oemName[ 8 ];
  45.   BIOS_PARAMETER_BLOCK bpb;
  46.   ubyte                physicalDiskDriveID;
  47.   ubyte                reserved;
  48.   ubyte                extendedBootSignature; /* 0x29 */
  49.   udword               volumeSerialNumber;
  50.   ubyte                volumeName[ 11 ]; /* "FAT32   " */
  51.   ubyte                FATName[ 8 ];
  52.   ubyte                executableCode[ 420 ];
  53.   uword                signature; /* 0x55 0xAA */
  54. };
  55. typedef struct _FAT32_BOOT FAT32_BOOT;
  56.  
  57. union _FAT32_BUFF
  58. {
  59.   ubyte      ubuffer[ 512 ];
  60.   byte       buffer[ 512 ];
  61.   FAT32_BOOT boot;
  62. };
  63. typedef union _FAT32_BUFF FAT32_BUFF;
  64.  
  65. /* restore alignment */
  66. #pragma pack( pop )
  67.  
  68. /* This procedure just for the pupose of binary file creation */
  69. /* that we will read and parse */
  70. void writeIt( )
  71. {
  72.   FILE* f;
  73.   ubyte buf[ 512 ];
  74.   size_t rc;
  75.  
  76.   /*
  77.     Based on real sector
  78. Absolute Sector 63 (Cylinder 0, Head 1, Sector 1)
  79.  
  80.                                               BPB         "System Name"
  81.                                                |                |
  82.          0  1  2  3  4  5  6  7  8  9  A  B  C |D  E  F         |
  83.  0000:  EB 58 90 4D 53 57 49 4E 34 2E 31 00 02 08 20 00  .X.MSWIN4.1... .
  84.  0010:  02 00 00 00 00 F8 00 00 3F 00 FF 00 EE 39 D7 00  ........?....9..
  85.  0020:  BD 86 BB 00 CD 2E 00 00 00 00 00 00 93 B2 0B 00  ................
  86.  0030:  01 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
  87.  0040:  80 00 29 56 2F BF 10 57 49 4E 39 38 5F 44 41 54  ..)V/..WIN98_DAT
  88.  0050:  41 00 46 41 54 33 32 20 20 20 33 C9 8E D1 BC F4  A.FAT32   3.....
  89.  0060:  7B 8E C1 8E D9 BD 00 7C 88 4E 02 8A 56 40 B4 08  {......|.N..V@..
  90.  0070:  CD 13 73 05 B9 FF FF 8A F1 66 0F B6 C6 40 66 0F  ..s......f...@f.
  91.  0080:  B6 D1 80 E2 3F F7 E2 86 CD C0 ED 06 41 66 0F B7  ....?.......Af..
  92.  0090:  C9 66 F7 E1 66 89 46 F8 83 7E 16 00 75 38 83 7E  .f..f.F..~..u8.~
  93.  00A0:  2A 00 77 32 66 8B 46 1C 66 83 C0 0C BB 00 80 B9  *.w2f.F.f.......
  94.  00B0:  01 00 E8 2B 00 E9 48 03 A0 FA 7D B4 7D 8B F0 AC  ...+..H...}.}...
  95.  00C0:  84 C0 74 17 3C FF 74 09 B4 0E BB 07 00 CD 10 EB  ..t.<.t.........
  96.  00D0:  EE A0 FB 7D EB E5 A0 F9 7D EB E0 98 CD 16 CD 19  ...}....}.......
  97.  00E0:  66 60 66 3B 46 F8 0F 82 4A 00 66 6A 00 66 50 06  f`f;F...J.fj.fP.
  98.  00F0:  53 66 68 10 00 01 00 80 7E 02 00 0F 85 20 00 B4  Sfh.....~.... ..
  99.  0100:  41 BB AA 55 8A 56 40 CD 13 0F 82 1C 00 81 FB 55  A..U.V@........U
  100.  0110:  AA 0F 85 14 00 F6 C1 01 0F 84 0D 00 FE 46 02 B4  .............F..
  101.  0120:  42 8A 56 40 8B F4 CD 13 B0 F9 66 58 66 58 66 58  B.V@......fXfXfX
  102.  0130:  66 58 EB 2A 66 33 D2 66 0F B7 4E 18 66 F7 F1 FE  fX.*f3.f..N.f...
  103.  0140:  C2 8A CA 66 8B D0 66 C1 EA 10 F7 76 1A 86 D6 8A  ...f..f....v....
  104.  0150:  56 40 8A E8 C0 E4 06 0A CC B8 01 02 CD 13 66 61  V@............fa
  105.  0160:  0F 82 54 FF 81 C3 00 02 66 40 49 0F 85 71 FF C3  ..T.....f@I..q..
  106.  0170:  4E 54 4C 44 52 20 20 20 20 20 20 00 00 00 00 00  NTLDR      .....
  107.  0180:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
  108.  0190:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
  109.  01A0:  00 00 00 00 00 00 00 00 00 00 00 00 0D 0A 4E 54  ..............NT
  110.  01B0:  4C 44 52 20 69 73 20 6D 69 73 73 69 6E 67 FF 0D  LDR is missing..
  111.  01C0:  0A 44 69 73 6B 20 65 72 72 6F 72 FF 0D 0A 50 72  .Disk error...Pr
  112.  01D0:  65 73 73 20 61 6E 79 20 6B 65 79 20 74 6F 20 72  ess any key to r
  113.  01E0:  65 73 74 61 72 74 0D 0A 00 00 00 00 00 00 00 00  estart..........
  114.  01F0:  00 00 00 00 00 00 00 00 00 AC BF CC 00 00 55 AA  ..............U.
  115.  
  116.          0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F
  117.    */
  118.   buf[   0 ] = 0xEB;
  119.   buf[   1 ] = 0x58;
  120.   buf[   2 ] = 0x90;
  121.   buf[   3 ] = 'M';
  122.   buf[   4 ] = 'S';
  123.   buf[   5 ] = 'W';
  124.   buf[   6 ] = 'I';
  125.   buf[   7 ] = 'N';
  126.   buf[   8 ] = '4';
  127.   buf[   9 ] = '.';
  128.   buf[  10 ] = '1';
  129.   buf[  11 ] = 0x00;
  130.   buf[  12 ] = 0x02;
  131.   buf[  13 ] = 0x08;
  132.   buf[  14 ] = 0x20;
  133.   buf[  15 ] = 0x00;
  134.  
  135.   buf[  16 ] = 0x02;
  136.   buf[  17 ] = 0x00;
  137.   buf[  18 ] = 0x00;
  138.   buf[  19 ] = 0x00;
  139.   buf[  20 ] = 0x00;
  140.   buf[  21 ] = 0xF8;
  141.   buf[  22 ] = 0x00;
  142.   buf[  23 ] = 0x00;
  143.   buf[  24 ] = 0x3F;
  144.   buf[  25 ] = 0x00;
  145.   buf[  26 ] = 0xFF;
  146.   buf[  27 ] = 0x00;
  147.   buf[  28 ] = 0xEE;
  148.   buf[  29 ] = 0x39;
  149.   buf[  30 ] = 0xD7;
  150.   buf[  31 ] = 0x00;
  151.  
  152.   buf[  32 ] = 0xBD;
  153.   buf[  33 ] = 0x86;
  154.   buf[  34 ] = 0xBB;
  155.   buf[  35 ] = 0x00;
  156.   buf[  36 ] = 0xCD;
  157.   buf[  37 ] = 0x2E;
  158.   buf[  38 ] = 0x00;
  159.   buf[  39 ] = 0x00;
  160.   buf[  40 ] = 0x00;
  161.   buf[  41 ] = 0x00;
  162.   buf[  42 ] = 0x00;
  163.   buf[  43 ] = 0x00;
  164.   buf[  44 ] = 0x93;
  165.   buf[  45 ] = 0xB2;
  166.   buf[  46 ] = 0x0B;
  167.   buf[  47 ] = 0x00;
  168.  
  169.   buf[  48 ] = 0x01;
  170.   buf[  49 ] = 0x00;
  171.   buf[  50 ] = 0x06;
  172.   buf[  51 ] = 0x00;
  173.   buf[  52 ] = 0x00;
  174.   buf[  53 ] = 0x00;
  175.   buf[  54 ] = 0x00;
  176.   buf[  55 ] = 0x00;
  177.   buf[  56 ] = 0x00;
  178.   buf[  57 ] = 0x00;
  179.   buf[  58 ] = 0x00;
  180.   buf[  59 ] = 0x00;
  181.   buf[  60 ] = 0x00;
  182.   buf[  61 ] = 0x00;
  183.   buf[  62 ] = 0x00;
  184.   buf[  63 ] = 0x00;
  185.  
  186.   buf[  64 ] = 0x80;
  187.   buf[  65 ] = 0x00;
  188.   buf[  66 ] = 0x29;
  189.   buf[  67 ] = 0x56;
  190.   buf[  68 ] = 0x2F;
  191.   buf[  69 ] = 0xBF;
  192.   buf[  70 ] = 0x10;
  193.   buf[  71 ] = 0x57;
  194.   buf[  72 ] = 0x49;
  195.   buf[  73 ] = 0x4E;
  196.   buf[  74 ] = 0x39;
  197.   buf[  75 ] = 0x38;
  198.   buf[  76 ] = 0x5F;
  199.   buf[  77 ] = 0x44;
  200.   buf[  78 ] = 0x41;
  201.   buf[  79 ] = 0x54;
  202.  
  203.   buf[  80 ] = 0x41;
  204.   buf[  81 ] = 0x00;
  205.   buf[  82 ] = 0x46;
  206.   buf[  83 ] = 0x41;
  207.   buf[  84 ] = 0x54;
  208.   buf[  85 ] = 0x33;
  209.   buf[  86 ] = 0x32;
  210.   buf[  87 ] = 0x20;
  211.   buf[  88 ] = 0x20;
  212.   buf[  89 ] = 0x20;
  213.  
  214.   buf[ 510 ] = 0x55;
  215.   buf[ 511 ] = 0xAA;
  216.  
  217.  
  218.  
  219.   f = fopen( "boot.bin", "wb" );
  220.   if ( f )
  221.   {
  222.     rc = fwrite( buf, sizeof( buf ), 1, f );
  223.     if ( rc != 1 )
  224.     {
  225.       printf( "could not write.\n" );
  226.     }
  227.     fclose( f );
  228.   }
  229.   else
  230.   {
  231.     printf( "Could not open for writting.\n" );
  232.   }
  233. }
  234.  
  235. int main( int argc, char* argv[ ] )
  236. {
  237.   FAT32_BUFF fat32Buffer;
  238.   size_t rc;
  239.  
  240.   printf( "sizeof( FAT32_BOOT )=%d.\n", sizeof( FAT32_BOOT ) );
  241.  
  242.  
  243.   fat32Buffer.buffer[ 0 ] = 0x00;
  244.  
  245.   writeIt( );
  246.  
  247.  
  248.   FILE* f;
  249.   f = fopen( "boot.bin", "rb" );
  250.   if ( f )
  251.   {
  252.     rc = fread( fat32Buffer.buffer, sizeof( fat32Buffer.buffer ), 1, f );
  253.     if ( rc == 1 )
  254.     {
  255.       printf( "bytes per sector=%hu\n"
  256.           "OEM Name=%8.8s\n"
  257.               "FAT Name=%8.8s\n"
  258.           "sectorPerCluster=%hu\n"
  259.           "reservedSectors=hu\n"
  260.           "numberOfFATs=%hu\n"
  261.           "rootEntries=%hu\n"
  262.           "totalSectors=%hu\n"
  263.           "mediaDescriptor=%hu\n"
  264.           "sectorsPerFAT=%hu\n"
  265.           "sectorsPerTrack=$hu\n"
  266.           "heads=%hu\n"
  267.           "hiddenSectors=%u\n"
  268.           "bigTotalSectors=%u\n"
  269.           "bigSectorsPerFat=%u\n"
  270.           "extFlags=%02hX\n"
  271.           "FS_Version=%hu\n"
  272.           "rootDirStrtClus=%u\n"
  273.           "FSInfoSec=%hu\n"
  274.           "bkUpBootSec=%hu\n"
  275.               ,
  276.           fat32Buffer.boot.bpb.bytesPerSector,
  277.           fat32Buffer.boot.oemName,
  278.           fat32Buffer.boot.FATName,
  279.           fat32Buffer.boot.bpb.sectorPerCluster,
  280.           fat32Buffer.boot.bpb.reservedSectors,
  281.           fat32Buffer.boot.bpb.numberOfFATs,
  282.           fat32Buffer.boot.bpb.rootEntries,
  283.           fat32Buffer.boot.bpb.totalSectors,
  284.           fat32Buffer.boot.bpb.mediaDescriptor,
  285.           fat32Buffer.boot.bpb.sectorsPerFAT,
  286.           fat32Buffer.boot.bpb.sectorsPerTrack,
  287.           fat32Buffer.boot.bpb.heads,
  288.           fat32Buffer.boot.bpb.hiddenSectors,
  289.           fat32Buffer.boot.bpb.bigTotalSectors,
  290.           fat32Buffer.boot.bpb.bigSectorsPerFat,
  291.           fat32Buffer.boot.bpb.extFlags,
  292.           fat32Buffer.boot.bpb.FS_Version,
  293.           fat32Buffer.boot.bpb.rootDirStrtClus,
  294.           fat32Buffer.boot.bpb.FSInfoSec,
  295.           fat32Buffer.boot.bpb.bkUpBootSec
  296.         );
  297.     }
  298.     else
  299.     {
  300.       printf( "was not able to read.\n" );
  301.     }
  302.     fclose( f );
  303.   }
  304.  
  305.   return 0;
  306. }

code text
  1.  
  2. (evstiomv@opal)/<6>fat:91> gcc fat32.c -o fat32
  3. (evstiomv@opal)/<6>fat:92> ./fat32
  4. sizeof( FAT32_BOOT )=512.
  5. bytes per sector=512
  6. OEM Name=MSWIN4.1
  7. FAT Name=FAT32
  8. sectorPerCluster=8
  9. (evstiomv@opal)/<6>fat:93> gcc fat32.c -o fat32
  10. (evstiomv@opal)/<6>fat:94> ./fat32
  11. sizeof( FAT32_BOOT )=512.
  12. bytes per sector=512
  13. OEM Name=MSWIN4.1
  14. FAT Name=FAT32
  15. sectorPerCluster=8
  16. reservedSectors=hu
  17. numberOfFATs=32
  18. rootEntries=2
  19. totalSectors=0
  20. mediaDescriptor=0
  21. sectorsPerFAT=248
  22. sectorsPerTrack=$hu
  23. heads=0
  24. hiddenSectors=63
  25. bigTotalSectors=255
  26. bigSectorsPerFat=14105070
  27. extFlags=BB86BD
  28. FS_Version=11981
  29. rootDirStrtClus=0
  30. FSInfoSec=0
  31. bkUpBootSec=45715
  32. (evstiomv@opal)/<6>fat:95> gcc fat32.c -o fat32
  33. (evstiomv@opal)/<6>fat:96> ./fat32
  34. sizeof( FAT32_BOOT )=512.
  35. bytes per sector=512
  36. OEM Name=MSWIN4.1
  37. FAT Name=FAT32
  38. sectorPerCluster=8
  39. reservedSectors=hu
  40. numberOfFATs=32
  41. rootEntries=2
  42. totalSectors=0
  43. mediaDescriptor=0
  44. sectorsPerFAT=248
  45. sectorsPerTrack=$hu
  46. heads=0
  47. hiddenSectors=63
  48. bigTotalSectors=255
  49. bigSectorsPerFat=14105070
  50. extFlags=86BD
  51. FS_Version=11981
  52. rootDirStrtClus=0
  53. FSInfoSec=0
  54. bkUpBootSec=45715
  55. (evstiomv@opal)/<6>fat:97>


Т.е. типы введены, структурки и юнион. Основное использование в main — объявление, в fread и распечатка. Т.е. читаем, как буфер из char, а работаем со структурой. В юнионе два типа буфера — с char и unsigned char — иногда программки капризничают. Но это скорее к C++.
   7.0.17.0.1
Это сообщение редактировалось 07.12.2011 в 03:19
US Mishka #07.12.2011 03:24  @Сергей-4030#06.12.2011 23:39
+
-
edit
 

Mishka

модератор
★★★
Сергей-4030> Хотя, конечно, тут уже надо смотреть. Может, правильно сделать так:
Сергей-4030> Наверное, тебе покажется это излишним, но я думаю, что если твоя задача примерно такая, эти методы написать очень даже стоит.

Этот вариант хорошо, если поток надо разбирать. И значение некоторых полей определяют структуру последующих полей. ИМХО, если структура известно, то union из буфера и структур лучше.
   7.0.17.0.1

digger

аксакал

Есть метод решения проблем с порядком байт : байт-переключательные макро, вроде х = x_dword(struct->x).Макро определяются в конфиге компиляции.Порядок байт в бутсекторе может отличаться от порядка байт в контроллере, а некоторые мерзкие процессоры кроме того генерируют исключение при чтении ворда и дворда не выравненных по четной границе.Кроме того, в структуре должно быть отключено выравнивание членов, директивой компилятора, или вставлен паддинг, если такое невозможно на данном компиляторе.
Тема - иллюстрация вредоносности скриптов и чем они отличаются от человеческих языков.В языке можно всё и непосредственно ,а привыкшему к скриптам это сложно :).
   3.6.83.6.8
US Сергей-4030 #22.01.2012 20:42  @digger#22.01.2012 20:04
+
-
edit
 

Сергей-4030

исключающий третье
★★
digger> Тема - иллюстрация вредоносности скриптов и чем они отличаются от человеческих языков.В языке можно всё и непосредственно ,а привыкшему к скриптам это сложно :).

Это опять про Java? И опять от человека, который Java не знает? :lol: Как предсказуемо.
   16.0.912.7516.0.912.75
IL digger #22.01.2012 21:03  @Сергей-4030#22.01.2012 20:42
+
-
edit
 

digger

аксакал

Я как раз на ней сейчас пишу под Андроид, с матами,но получается. Человек выше по теме пишет на VB#, та же холера.
   3.6.83.6.8

Mishka

модератор
★★★
digger> Есть метод решения проблем с порядком байт : байт-переключательные макро, вроде х = x_dword(struct->x).Макро определяются в конфиге компиляции.

Это, к сожалению, не всегда возможно. Иногда приходится динамически определять. А с битами ещё хуже. Ситуации я описывал уже раньше.

digger> Порядок байт в бутсекторе может отличаться от порядка байт в контроллере,

Ы? Какое отношение имеет контроллер к нашей программе? У тебя порядок и структура заданы извне. Поэтому доступ к нужным полям идёт в соответствии либо с макро, либо с процедуркой.

digger> а некоторые мерзкие процессоры кроме того генерируют исключение при чтении ворда и дворда не выравненных по четной границе.Кроме того, в структуре должно быть отключено выравнивание членов, директивой компилятора,


А чем они мерзкие? Пиши программку, как надо, и не будет проблем. В частности, побайтовый доступ используй.

А про выравнивание — директивы проца рулят. Если бы читал внимательно, то заметил бы строчки 15 и 66.

digger> или вставлен паддинг, если такое невозможно на данном компиляторе.

Ни в коем разе. Никакого падинга. Структура сообщения определена. И добавление ничего, кроме геморроя не принесет.
digger> Тема - иллюстрация вредоносности скриптов и чем они отличаются от человеческих языков.В языке можно всё и непосредственно ,а привыкшему к скриптам это сложно :).

Тема показатель того, что сначала надо вычить те скрипты, а потом делать выводы. :)
   5.05.0
US Сергей-4030 #23.01.2012 08:30  @digger#22.01.2012 21:03
+
-
edit
 

Сергей-4030

исключающий третье
★★
digger> Я как раз на ней сейчас пишу под Андроид, с матами,но получается. Человек выше по теме пишет на VB#, та же холера.

Диггер, а если вдруг кто напишет транслятор с Java в нативный код x86, Java сразу станет крутым языком для настоящих чуваков? Это же главная ваша претензия, правда?
   16.0.912.7516.0.912.75
RU arkhnchul #23.01.2012 13:08  @Сергей-4030#23.01.2012 08:30
+
-
edit
 

arkhnchul

втянувшийся

Сергей-4030> а если вдруг кто напишет транслятор с Java в нативный код x86

gcj? Не транслятор, но близко к тексту.
   9.0.19.0.1
1 2 3 4 5

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru