C Макроопределение для определения машины с прямым порядком байтов или с обратным порядком байтов?

Поскольку код JS запускается в браузере пользователя, а Java запускается на вашем сервере, единственный способ передать данные из Javascript в Java - выполнить Ajax-вызов. На вашем сервере вам нужна конечная точка API, которая принимает запросы, а затем после получения нужных данных вы можете обрабатывать их в своей Java-программе.

Проверьте:

Надеюсь, это поможет!

101
задан Ryan Haining 2 May 2018 в 23:00
поделиться

9 ответов

код, поддерживающий произвольные байтовые заказы, готовые к тому, чтобы быть введенным в файл order order32.h :

#ifndef ORDER32_H
#define ORDER32_H

#include <limits.h>
#include <stdint.h>

#if CHAR_BIT != 8
#error "unsupported char size"
#endif

enum
{
    O32_LITTLE_ENDIAN = 0x03020100ul,
    O32_BIG_ENDIAN = 0x00010203ul,
    O32_PDP_ENDIAN = 0x01000302ul,      /* DEC PDP-11 (aka ENDIAN_LITTLE_WORD) */
    O32_HONEYWELL_ENDIAN = 0x02030001ul /* Honeywell 316 (aka ENDIAN_BIG_WORD) */
};

static const union { unsigned char bytes[4]; uint32_t value; } o32_host_order =
    { { 0, 1, 2, 3 } };

#define O32_HOST_ORDER (o32_host_order.value)

#endif

Вы бы проверили на небольшие эндин системы через

O32_HOST_ORDER == O32_LITTLE_ENDIAN
94
ответ дан 24 November 2019 в 04:37
поделиться

При дампе препроцессора #defines

gcc -dM -E - < /dev/null
g++ -dM -E -x c++ - < /dev/null

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

#define __LITTLE_ENDIAN__ 1
#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__

Различные компиляторы могут иметь отличающийся, определяет как бы то ни было.

1
ответ дан 24 November 2019 в 04:37
поделиться

Инъекция зависимости иногда может быть использовано.

-121--3843866-

Если у вас есть компилятор, который поддерживает C99 сложных литералов:

#define IS_BIG_ENDIAN (!*(unsigned char *)&(uint16_t){1})

или:

#define IS_BIG_ENDIAN (!(union { uint16_t u16; unsigned char c; }){ .u16 = 1 }.c)

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


Пример независимой в хост-цене, независимо от участия NTOHL () :

uint32_t ntohl(uint32_t n)
{
    unsigned char *np = (unsigned char *)&n;

    return ((uint32_t)np[0] << 24) |
        ((uint32_t)np[1] << 16) |
        ((uint32_t)np[2] << 8) |
        (uint32_t)np[3];
}
44
ответ дан 24 November 2019 в 04:37
поделиться

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

Вы можете преобразовать его в короткий макрос, используя статическую или глобальную переменную, как это:

static int s_endianess = 0;
#define ENDIANESS() ((s_endianess = 1), (*(unsigned char*) &s_endianess) == 0)
6
ответ дан 24 November 2019 в 04:37
поделиться

Нет стандарта, а на многих системах, включая даст вам некоторые определять, чтобы искать.

39
ответ дан 24 November 2019 в 04:37
поделиться

В то время как нет портативного #define или что-то для того, чтобы полагаться, платформы предоставляют стандартные функции для преобразования в и с вашего «Host» Endian.

Вообще, вы делаете хранилище - на диск или сеть - используя «сеть Endian», что является большим Endian, а локальные вычисления с использованием хоста Endian (что на X86 мало Endian). Вы используете htons () и ntohs () и друзья для преобразования между двумя.

5
ответ дан 24 November 2019 в 04:37
поделиться

Попробуйте это:

#include<stdio.h>        
int x=1;
#define TEST (*(char*)&(x)==1)?printf("little endian"):printf("Big endian")
int main()
{

   TEST;
}
3
ответ дан 24 November 2019 в 04:37
поделиться

Если вы хотите полагаться только на препроцессоре, вы должны выяснить список предопределенных символов. Препроцессорная арифметика не имеет концепции адресации.

GCC на Mac определяет __ Mitele_endian __ или __ Big_endian __

$ gcc -E -dM - < /dev/null |grep ENDIAN
#define __LITTLE_ENDIAN__ 1

Тогда вы можете добавить больше предварительно исправительных условных директив на основе обнаружения платформы, такими как #ifdef _win32 и т. Д.

19
ответ дан 24 November 2019 в 04:37
поделиться

Чтобы обнаружить эндианцу во время выполнения, вы должны иметь возможность обратиться к памяти. Если вы придерживаетесь стандартного C, декларирование переменной в памяти требуется оператор, но возвращение значения требует выражения. Я не знаю, как это сделать в одном макросе - вот почему GCC имеет расширения: -)

Если вы готовы иметь файл .h, вы можете определить

static uint32_t endianness = 0xdeadbeef; 
enum endianness { BIG, LITTLE };

#define ENDIANNESS ( *(const char *)&endianness == 0xef ? LITTLE \
                   : *(const char *)&endianness == 0xde ? BIG \
                   : assert(0))

, а затем вы можете использовать Эндианс Макрос, как вы.

27
ответ дан 24 November 2019 в 04:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: