- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
union bitdata {
struct {
unsigned int bit1 : 1;
unsigned int bit2 : 1;
unsigned int bit3 : 1;
unsigned int bit4 : 1;
unsigned int bit5 : 1;
unsigned int bit6 : 1;
unsigned int bit7 : 1;
unsigned int bit8 : 1;
};
unsigned char byte;
} first_byte, second_byte;
<...>
for ( j = 0; j < bytes_count; j++ ) {
unsigned char t;
ret = gzread( gz_fd, &t, sizeof( t ) );
if ( ret != sizeof( t ) ) {
printf( "Failed to read file %s: %s\n", argv[i], strerror( errno ) );
gzclose( gz_fd );
return EXIT_FAILURE;
}
first_byte.byte = t;
second_byte.byte = ready_bytes[j];
first_byte.bit1 = first_byte.bit1 == 0 && second_byte.bit1 == 0 ? 0 : 1;
first_byte.bit2 = first_byte.bit2 == 0 && second_byte.bit2 == 0 ? 0 : 1;
first_byte.bit3 = first_byte.bit3 == 0 && second_byte.bit3 == 0 ? 0 : 1;
first_byte.bit4 = first_byte.bit4 == 0 && second_byte.bit4 == 0 ? 0 : 1;
first_byte.bit5 = first_byte.bit5 == 0 && second_byte.bit5 == 0 ? 0 : 1;
first_byte.bit6 = first_byte.bit6 == 0 && second_byte.bit6 == 0 ? 0 : 1;
first_byte.bit7 = first_byte.bit7 == 0 && second_byte.bit7 == 0 ? 0 : 1;
first_byte.bit8 = first_byte.bit8 == 0 && second_byte.bit8 == 0 ? 0 : 1;
ready_bytes[j] = first_byte.byte;
}
Всё еще не можем понять, зачем в конце тернарник. Всё остальное уже не смущает.
Noodles 21.01.2022 20:09 # +1
Кто-то прогуливал мат логику.
bormand 21.01.2022 21:03 # +2
З.Ы. Тут же просто first_byte.byte |= second_byte.byte?
guest6 21.01.2022 21:06 # 0
codemeow 21.01.2022 21:08 # 0
bormand 21.01.2022 21:10 # 0
codemeow 21.01.2022 21:13 # 0
Noodles 21.01.2022 21:16 # 0
bormand 21.01.2022 21:19 # 0
Noodles 21.01.2022 21:23 # 0
bormand 21.01.2022 21:25 # +1
Noodles 21.01.2022 21:28 # +1
Какой багор )))
HoBorogHuu_nemyx 22.01.2022 08:45 # +1
3.14159265 22.01.2022 00:49 # 0
С одной стороны на лабу не похоже.
>return EXIT_FAILURE;
> strerror( errno )
И всё довольно вменяемо.
С другой, нумерация bit1 с единицы и реализация побитовой илишни руками.
guest6 22.01.2022 02:59 # 0
j123123 22.01.2022 04:43 # +1
bormand 22.01.2022 08:53 # 0
А я вот битовые структуры вообще не умею юзать... Мне проще через & и | побитоёбить.
HoBorogHuu_nemyx 22.01.2022 09:31 # 0
bormand 22.01.2022 09:50 # +1
Но в пределах одного ABI работать будет, конечно.
bormand 22.01.2022 10:24 # +1
- bit fields are allocated from right to left
- bit-fields must be contained in a storage unit appropriate for its declared type
- bit-fields may share a storage unit with other struct / union members
bormand 22.01.2022 10:44 # +2
Что такое "may share"? Т.е. при каких-то условиях могут и в разные юниты попасть?
Блядь, и это формальная спецификация?
Т.е. 16-битный storage unit вполне так appropriate для 8-битного поля. Но только если рядом есть другие 16-битные поля, иначе он уже не особо appropriate (по крайней мере для gcc). Где блядь об этом написано?
bormand 22.01.2022 10:54 # +2
bormand 22.01.2022 11:04 # +1
HoBorogHuu_nemyx 22.01.2022 21:26 # +1
Значит, неупакованный вариант можно использовать только для временного хранения.
bormand 23.01.2022 07:25 # +2
Именно так. Он походу пытается добиться какого-то баланса между пирфомансом и размером, из-за этого алгоритм совсем неочевидный.
И получается что вменяемого, документированного ABI у сишки для x86_64 нет. Всё работает только за счёт того, что конпеляторы подстраиваются под своих старших собратьев.
guest6 23.01.2022 00:37 # 0
Помоему это заивисит от проца
Fike 23.01.2022 02:07 # +1
HoBorogHuu_nemyx 23.01.2022 03:40 # 0
Fike 23.01.2022 04:35 # 0
HoBorogHuu_nemyx 22.01.2022 09:38 # 0
Видимо, производители компиляторов поддерживают этот хак, иначе куча программ сломается.
Noodles 22.01.2022 10:49 # 0
codemeow 22.01.2022 12:53 # +1
Finally, one of the changes from C90 to C99 was to remove any restriction on accessing one member of a union when the last store was to a different one. The rationale was that the behaviour would then depend on the representations of the values. Since this point is often misunderstood, it might well be worth making it clear in the Standard.
[...]
To address the issue about "type punning", attach a new footnote 78a to the words "named member" in 6.5.2.3#3: 78a If the member used to access the contents of a union object is not the same as the member last used to store a value in the object, the appropriate part of the object representation of the value is reinterpreted as an object representation in the new type as described in 6.2.6 (a process sometimes called "type punning"). This might be a trap representation.
DaveMustAim 22.01.2022 14:26 # +1
bormand 22.01.2022 15:41 # 0
HoBorogHuu_nemyx 22.01.2022 21:23 # 0
HoBorogHuu_nemyx 22.01.2022 09:44 # 0
bormand 22.01.2022 10:01 # 0
HoBorogHuu_nemyx 22.01.2022 14:40 # 0
Я про возможный хак для использования таких множеств вместо битовых полей. Типа:
Во Фрипаскаль добавили симметричную разность (><, экв. xor) и проверку на подмножество и надмножество (<= и >=).
ObeseYoung 22.01.2022 17:55 # +1
Есть же в паскакале obsolete для такого. Или на крайний случай можно кастануть.
HoBorogHuu_nemyx 22.01.2022 21:21 # 0
bormand 22.01.2022 19:09 # 0
HoBorogHuu_nemyx 22.01.2022 21:21 # 0
3.14159265 22.01.2022 05:32 # 0
HoBorogHuu_nemyx 22.01.2022 09:47 # 0
bormand 22.01.2022 10:06 # 0
HoBorogHuu_nemyx 22.01.2022 14:25 # 0
Так?
ObeseYoung 22.01.2022 09:53 # 0
bormand 22.01.2022 13:44 # 0
Хотя при желании можно запихать, конечно. Только это будет просто inflate без gzopen/gzread и прочего нинужного обвеса.
codemeow 22.01.2022 12:54 # +1
Fike 22.01.2022 23:09 # 0
каким образом в битах оказываются правильные значения?
я вижу юнион, но внутри же у него int, почему каждый из них занимает ровно один бит, а не 32 или сколько там предусмотрено платформой?
upd:
это указание длины что ли?
так можно было?
в пизду, будут джаваскриптером
ObeseYoung 22.01.2022 23:25 # 0
32 бита инт небось для выравнивания выбран.
HoBorogHuu_nemyx 23.01.2022 00:13 # 0
https://en.cppreference.com/w/c/language/bit_field
Fike 23.01.2022 00:21 # 0
HoBorogHuu_nemyx 23.01.2022 08:50 # 0
ObeseYoung 23.01.2022 10:57 # 0
Rooster 23.01.2022 11:21 # +1
ObeseYoung 23.01.2022 11:30 # +1
guest6 23.01.2022 00:25 # 0
Rooster 23.01.2022 08:24 # +1
Считай это сахарок над побитовыми оперециями, нопремер first_byte.bit2 = 1 скомпилица в first_byte.byte |= 0x02
Fike 23.01.2022 15:17 # 0
bormand 23.01.2022 16:07 # 0
Выравнивание storage unit'а для битовых полей соответствует тому типу, который попросили. В данном случае unsigned int. Т.е. эта структура, судя по всему, будет состоять из одного юнита на 4 байта из которых только 8 бит юзаются под битовые поля.
Soul_re@ver 23.01.2022 16:57 # +1
bormand 23.01.2022 16:59 # 0
guest6 23.01.2022 17:12 # +3
Чтобы первые пол года работать правильно, а потом выкинуть половину твоей программы в самый неожиданный момент
guest6 23.01.2022 02:31 # 0
j123123 23.01.2022 02:33 # 0
У меня в контроллерах нет никакого понятия "root privileges", поэтому я за контроллеры.
guest6 23.01.2022 02:41 # 0
Fike 23.01.2022 03:13 # +1
j123123 23.01.2022 03:11 # 0
https://www.bleepingcomputer.com/news/security/new-linux-sudo-flaw-lets-local-users-gain-root-privileges/
хотя подобные дыры наверняка еще будут.
bormand 23.01.2022 07:21 # −1
Для guest6 что-то слишком свежая новость... Я думала, что он что-нибудь из 90х принёс.
Soul_re@ver 23.01.2022 10:17 # 0
ObeseYoung 23.01.2022 11:35 # 0
guest6 23.01.2022 17:14 # 0
ObeseYoung 23.01.2022 21:47 # 0