Преобразование от целого числа на 32 бита до 4 символов

Предполагая, что вы задаете вопрос о дизайне веб-сервисов REST и точнее относительно успеха / ошибки.

Я думаю, что существует 3 разных типа дизайна.

  1. Использовать только статус HTTP чтобы указать, была ли ошибка, и попытаться ограничить себя стандартными (обычно этого должно быть достаточно). Плюсы: Это стандарт, независимый от вашего api. Минусы: меньше информации о том, что на самом деле произошло.
  2. Использовать статус HTTP Status + json (даже если это ошибка). Определите единую структуру для ошибок (например, код, сообщение, причину, тип и т. Д.) И используйте ее для ошибок, если это будет успешным, тогда просто верните ожидаемый ответ json. Плюсы: по-прежнему стандарт, когда вы используете существующие коды состояния HTTP, и вы возвращаете json, описывающий ошибку (вы предоставляете больше информации о том, что произошло). Минусы: выход json будет меняться в зависимости от ошибки или успеха.
  3. Забудьте о статусе http (например: всегда статус 200), всегда используйте json и добавьте в корневой части ответа логический responseValid и объект ошибки (код, сообщение и т. д.), который будет заполнен, если он является ошибкой, иначе будут заполнены другие поля (успех). Плюсы: клиент имеет дело только с телом ответа, который является json-строкой и игнорирует статус (?). Минусы: чем меньше стандарт.

Вам решать:)

В зависимости от API я бы выбрал 2 или 3 (предпочитаю 2 для json rest apis). Еще одна вещь, которую я испытал при разработке REST Api, - это важность документации для каждого ресурса (url): параметры, тело, ответ, заголовки и т. Д. + Примеры.

Я также рекомендовал бы использовать jersey (реализация jax-rs) + genson (java / json databinding library). Вам нужно только удалить genson + jersey в вашем пути к классу, и json автоматически поддерживается.

EDIT:

  • Решение 2 сложнее всего реализовать, но преимущество в том, что вы можете
  • Решение 3 легко реализовать как на стороне сервера, так и на стороне клиента, но это не так приятно, как вы должен будет инкапсулировать объекты, которые вы хотите вернуть, в объект ответа, содержащий также ошибку responseValid +.

5
задан Guille 23 September 2008 в 13:45
поделиться

7 ответов

Quick'n'dirty:

int value = 0x48454C4F;
Console.WriteLine(Encoding.ASCII.GetString(
  BitConverter.GetBytes(value).Reverse().ToArray()
));

Преобразование интервала к байтам, инвертирование массива байтов для правильного порядка и затем получение символьного представления ASCII от него.

Править: Обратный метод является дополнительным методом от.NET 3.5, только для получения информации. Инвертирование порядка байтов не может также быть необходимо в Вашем сценарии.

С наилучшими пожеланиями, David

7
ответ дан 18 December 2019 в 07:58
поделиться

Символ? Возможно, Вы ищете эту удобную небольшую функцию помощника?

Byte[] b = BitConverter.GetBytes(i);
Char c = (Char)b[0];
[...]
5
ответ дан 18 December 2019 в 07:58
поделиться

Не ясно, действительно ли это, что Вы хотите, но:

int x = yourNumber();
char a = (char)(x & 0xff);
char b = (char)((x >> 8) & 0xff);
char c = (char)((x >> 16) & 0xff);
char d = (char)((x >> 24) & 0xff);

Это предполагает желание байтов, интерпретируемых как самый низкий диапазон символов Unicode.

4
ответ дан 18 December 2019 в 07:58
поделиться

Я попробовал его несколько путей и показал время, потраченное для преобразования 1000000 ints.

Встроенный метод преобразования, 325 000 галочек:

Encoding.ASCII.GetChars(BitConverter.GetBytes(x));

Преобразование указателя, 100 000 галочек:

static unsafe char[] ToChars(int x)
{
    byte* p = (byte*)&x)
    char[] chars = new char[4];
    chars[0] = (char)*p++;
    chars[1] = (char)*p++;
    chars[2] = (char)*p++;
    chars[3] = (char)*p;

    return chars;
}

Bitshifting, 77 000 галочек:

public static char[] ToCharsBitShift(int x)
{
     char[] chars = new char[4];
     chars[0] = (char)(x & 0xFF);
     chars[1] = (char)(x >> 8 & 0xFF);
     chars[2] = (char)(x >> 16 & 0xFF);
     chars[3] = (char)(x >> 24 & 0xFF);
     return chars;
}
4
ответ дан 18 December 2019 в 07:58
поделиться

Действительно получите 8 блоков байта:

int a = i & 255; // bin 11111111
int b = i & 65280; // bin 1111111100000000

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

Править: Решение Jason со сдвигами разряда намного более хорошо, конечно.

0
ответ дан 18 December 2019 в 07:58
поделиться

BitConverter

0
ответ дан 18 December 2019 в 07:58
поделиться

.NET использует Unicode, символ составляет 2 байта не 1

Преобразовать между двоичными данными, содержащими non-unicode текстовое использование Система. Текст. Кодирование класса.

Если Вы хотите 4 байта, и не символы затем заменяют символ байтом в ответе Jason

0
ответ дан 18 December 2019 в 07:58
поделиться
Другие вопросы по тегам:

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