Ошибка побитового массива
Я новичок в программировании и даже больше в программировании. Я пытаюсь прочитать двоичный файл, а затем сделать побитовый процесс. Пример моего кода и как я написал свою программу до сих пор.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <unistd.h>
#include <inttypes.h> /* Use C99 format specifiers: "%" PRIu8 "\n", "%" PRIu32 "\n" */
typedef struct{
uint32_t size; /* Unsigned int 4 bytes (32 bits) */
}mp3_Header;
int main (int argc, char *argv[]) {
mp3_Header first;
unsigned int memory_int[4];
FILE *file = fopen( "song.mp3" , "rb" );
/* 1 Byte flags + revision_number 1 Byte + major_version 1 Byte + header_id 3 Bytes = 6 */
if ( fseek( file , 6 , SEEK_SET ) == -1 ) {
fprintf( stderr, "Not able to fseek at possition 6" );
return EXIT_FAILURE;
}
if ( fread( memory_int , sizeof(memory_int) , 1 , file ) != 1) {
printf("Could not read first.size\n");
exit (0);
}
printf ("This is first.size before sync_safe: %u\n", memory_int);
first.size = (memory_int[3] & 0xFF) |
((memory_int[2] & 0xFF) << 7 ) |
((memory_int[1] & 0xFF) << 14 ) |
((memory_int[0] & 0xFF) << 21 );
printf ("This is first.size after sync_safe: %" PRIu32"\n", first.size);
fclose(file);
return 0;
}
Когда я компилирую код, я получаю сообщение об ошибке:
error: subscripted value is neither array nor pointer nor vector
first.size = (first.size[3] & 0xFF) |
Я попытался объявить другое значение как:
unsigned int memory_int[4];
Когда я компилирую код, я получаю предупреждение:
warning: format ‘%u’ expects argument of type ‘unsigned int’, but argument 2 has type ‘unsigned int *’ [-Wformat=]
printf ("This is memset memory_int: %u\n", memory_int);
Хотя я изменил%" PRIu32" на%u, я все еще получаю это предупреждение.
Я знаю, что когда я использую typedef struct
Я могу вызвать контент, используя name.parameter, и программа, кажется, работает правильно, когда я звоню first.size
значение, когда это необходимо. Но я сталкиваюсь с проблемой, когда пытаюсь поразрядно, потому что я прошу значение разбить на биты. Теоретически это должно быть возможно, поскольку я определил его как 32-битный, но практически я упускаю что-то очень маленькое. Я пытался присвоить другое значение как uint32_t, а также как unsigned int size[4] оба раза не успешно. Может кто-нибудь объяснить мне причину и как решить эту проблему?
3 ответа
В вашем коде нужно изменить некоторые вещи.
Во-первых, используйте " "
в названии файла для чтения, как fopen
Синакс это
FILE *fopen(const char *path, const char *mode);
Таким образом, filename
[path
] будет const char *
Во-вторых, добавьте следующие строки в ваш код [после существующей строки].
FILE *file = fopen("song.mp3" , "rb" );
if (!file)
{
printf("Unable to open the file for reading\n");
exit (0);
}
Это поможет вам справиться с некоторыми неожиданными условиями, такими как "Файл не существует"
В-третьих, объявить memory_int
как массив unsigned int
содержащий 4 элемента.
unsigned int memory_int[4] = {0};
Наконец, в целом код выглядит следующим образом.
#include <stdint.h>
#include <unistd.h>
#include <inttypes.h> /* Use C99 format specifiers: "%" PRIu8 "\n", "%" PRIu32 "\n" */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <unistd.h>
#include <inttypes.h> /* Use C99 format specifiers: "%" PRIu8 "\n", "%" PRIu32 "\n" */
typedef struct{
uint32_t size; /* Unsigned int 4 bytes (32 bits) */
}mp3_Header;
int main (int argc, char *argv[]) {
unsigned int memory_int[4] = {0};
mp3_Header first;
FILE *file = fopen("song.mp3" , "rb" );
if (!file)
{
printf("Unable to open the file for reading\n");
exit (0);
}
/* 1 Byte flags + revision_number 1 Byte + major_version 1 Byte + header_id 3 Bytes = 6 */
if ( fseek( file , 6 , SEEK_SET ) == -1 ) {
fprintf( stderr, "Not able to fseek at possition 6" );
return EXIT_FAILURE;
}
if ( fread( memory_int , sizeof(memory_int) , 1 , file ) != 1) {
printf("Could not read first.size\n");
exit (0);
}
printf ("This is first.size before sync_safe: %u %u %u %u\n", memory_int[0],memory_int[1],memory_int[2],memory_int[3]);
first.size = (memory_int[3] & 0xFF) |
((memory_int[2] & 0xFF) << 7 ) |
((memory_int[1] & 0xFF) << 14 ) |
((memory_int[0] & 0xFF) << 21 );
printf ("This is first.size after sync_safe: %u\n", first.size);
fclose(file);
return 0;
}
Надеюсь, это работает!
В соответствии printf ("This is first.size before sync_safe: %u\n", memory_int);
: %u
было бы полезно распечатать memory_int[0]
,
Один из способов печати четырех элементов memory_int
будет использовать %u %u %u %u
,
Я также изменил некоторые вещи в побитовых операциях. Я предпочел %x
(шестнадцатеричный) спецификатор для отображения выходных данных: будет намного проще исправить выходные данные побитовых операций.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <unistd.h>
#include <inttypes.h> /* Use C99 format specifiers: "%" PRIu8 "\n", "%" PRIu32 "\n" */
typedef struct{
uint32_t size; /* Unsigned int 4 bytes (32 bits) */
}mp3_Header;
int main (int argc, char *argv[]) {
mp3_Header first;
unsigned int memory_int[4];
FILE *file = fopen( "song.dat" , "rb" );
/* 1 Byte flags + revision_number 1 Byte + major_version 1 Byte + header_id 3 Bytes = 6 */
if ( fseek( file , 6 , SEEK_SET ) == -1 ) {
fprintf( stderr, "Not able to fseek at possition 6" );
return EXIT_FAILURE;
}
//printf("%u\n",sizeof(memory_int));
if ( fread( memory_int , sizeof(memory_int) , 1 , file ) != 1) {
printf("Could not read first.size\n");
exit (0);
}
printf ("This is first.size before sync_safe: %x %x %x %x\n", memory_int[0],memory_int[1],memory_int[2],memory_int[3]);
memory_int[0]=0x4212;
memory_int[1]=0x4213;
memory_int[2]=0x4214;
memory_int[3]=0x4215;
first.size = (memory_int[3] & 0x000F) |
((memory_int[2] & 0x000F) << 8 ) |
((memory_int[1] & 0x000F) << 16 ) |
((memory_int[0] & 0x000F) << 24 );
printf ("This is first.size after sync_safe: %x\n", first.size);
fclose(file);
return 0;
}
До свидания,
Фрэнсис
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <unistd.h>
#include <inttypes.h> /* Use C99 format specifiers: "%" PRIu8 "\n", "%" PRIu32 "\n" */
typedef struct{
uint32_t size; /* Unsigned int 4 bytes (32 bits) */
}mp3_Header;
int main (int argc, char *argv[]) {
mp3_Header first;
unsigned int memory_int[4];
uint32_t memory_int_2[4];
char memory[4];
unsigned char memory_2[4];
FILE *file = fopen( "song.mp3" , "rb" );
/* 1 Byte flags + revision_number 1 Byte + major_version 1 Byte + header_id 3 Bytes = 6 */
if ( fseek( file , 6 , SEEK_SET ) == -1 ) {
fprintf( stderr, "Not able to fseek at possition 6" );
return EXIT_FAILURE;
}
if ( fread( memory_int , sizeof(memory_int) , 1 , file ) != 1) {
printf("Could not read first.size\n");
exit (0);
}
/* 1 Byte flags + revision_number 1 Byte + major_version 1 Byte + header_id 3 Bytes = 6 */
if ( fseek( file , 6 , SEEK_SET ) == -1 ) {
fprintf( stderr, "Not able to fseek at possition 6" );
return EXIT_FAILURE;
}
if ( fread( &first.size , sizeof(first.size) , 1 , file ) != 1) {
printf("Could not read first.size\n");
exit (0);
}
/* 1 Byte flags + revision_number 1 Byte + major_version 1 Byte + header_id 3 Bytes = 6 */
if ( fseek( file , 6 , SEEK_SET ) == -1 ) {
fprintf( stderr, "Not able to fseek at possition 6" );
return EXIT_FAILURE;
}
if ( fread( memory_int_2 , sizeof(memory_int_2) , 1 , file ) != 1) {
printf("Could not read first.size\n");
exit (0);
}
/* 1 Byte flags + revision_number 1 Byte + major_version 1 Byte + header_id 3 Bytes = 6 */
if ( fseek( file , 6 , SEEK_SET ) == -1 ) {
fprintf( stderr, "Not able to fseek at possition 6" );
return EXIT_FAILURE;
}
if ( fread( memory , sizeof(memory) , 1 , file ) != 1) {
printf("Could not read first.size\n");
exit (0);
}
/* 1 Byte flags + revision_number 1 Byte + major_version 1 Byte + header_id 3 Bytes = 6 */
if ( fseek( file , 6 , SEEK_SET ) == -1 ) {
fprintf( stderr, "Not able to fseek at possition 6" );
return EXIT_FAILURE;
}
if ( fread( memory_2 , sizeof(memory_2) , 1 , file ) != 1) {
printf("Could not read first.size\n");
exit (0);
}
printf ("This is memory_int[0] before sync_safe: %u %u %u %u\n", memory_int[0],memory_int[1],memory_int[2],memory_int[3]);
printf ("This is first.size before sync_safe: %" PRIu32"\n", first.size);
printf ("This is memory_int_2[0] before sync_safe with PRIu32: %" PRIu32" %" PRIu32" %" PRIu32" %" PRIu32"\n", memory_int_2[0],memory_int_2[1],memory_int_2[2],memory_int_2[3]);
printf ("This is memory[0] before sync_safe: %d %d %d %d\n", memory[0],memory[1],memory[2],memory[3]);
printf ("This is memory before sync_safe: %s\n", memory);
printf ("This is memory_2[0] before sync_safe: %d %d %d %d\n", memory_2[0],memory_2[1],memory_2[2],memory_2[3]);
printf ("This is memory_2 before sync_safe: %s\n", memory_2);
first.size = (memory_int[3] & 0xFF) |
((memory_int[2] & 0xFF) << 7 ) |
((memory_int[1] & 0xFF) << 14 ) |
((memory_int[0] & 0xFF) << 21 );
printf ("This is first.size after sync_safe: %" PRIu32"\n", first.size);
first.size = (first.size & 0xFF);
printf ("This is first.size after sync_safe: %" PRIu32"\n", first.size);
first.size = (memory[3] & 0xFF) |
((memory[2] & 0xFF) << 7 ) |
((memory[1] & 0xFF) << 14 ) |
((memory[0] & 0xFF) << 21 );
printf ("This is first.size after sync_safe: %" PRIu32"\n", first.size);
first.size = (memory_2[3] & 0xFF) |
((memory_2[2] & 0xFF) << 7 ) |
((memory_2[1] & 0xFF) << 14 ) |
((memory_2[0] & 0xFF) << 21 );
printf ("This is first.size after sync_safe: %" PRIu32"\n", first.size);
fclose(file);
return 0;
}
Когда я компилирую код, я получаю сообщение об ошибке:
ошибка: подписанное значение не является ни массивом, ни указателем, ни вектором first.size = (first.size[3] & 0xFF) |
Причина, по которой я получил эту ошибку, заключалась в том, что я пытался скомпилировать строку как массив. Я определил это как uint32_t size
и я называл это first.size[3]
, Конечно, это никогда не сработает, потому что одна - простая строка, а вторая - массив.
Это тестовый код, который я создаю в качестве примера, чтобы протестировать и узнать больше всего, чтобы решить мою проблему. Так как я только начал изучать программирование, у меня есть много вещей, которые нужно понять, понять и выучить.
Я надеюсь, что этот пример кода и поможет кому-то еще, как это сделал для меня.