Класс BinaryPrimitives в .NET. Замена для BitConverter

Оказывается, ещё начиная с .NET Standard в сборку System.Memory в нейсмпейс System.Buffers.Binary завезли класс BinaryPrimitives — расширенный аналог System.BitConverter. У BitConverter было два основных недостатка:

  1. BitConverter всегда конвертировал данные в соответствии c Endianess текущего процессора. Например, если приложение запущено на процессоре Intel x86 (amd64)-совместимой архитектуры, то порядок байт будеn Little-endian.
  2. BitConverter не умеет работать со Span<byte>.

Лично мне нужна была поддержка Big-endian и Span<T> и приходилось писать свои конверторы. Теперь можно пользоваться методами из BinaryPrimitives.

Например:

using System.Buffers.Binary;

public static ushort GetYear(ReadOnlySpan<byte> dateTime)
{
  return BinaryPrimitives.ReadUInt16BigEndian(dateTime.Slice(2));
}

Формат фрейма DLMS

Допустим, что тебе нужно обратиться к электросчётчику, который умеет разговаривать на DLMS\COSEM. Чтобы понять основы смотри, например, синюю книгу. (можешь скачать её на рутрекере)

И спросил ты у счётчика, например, таблицу специальных дней (интерфейсный класс 11). И ответил тебе счётчик. В синей книге описан формат ответа:

array spec_day_entry
spec_day_entry ::= structure
{
index: long-unsigned,
specialday_date: octet-string,
day_id: unsigned
}
Where:
- specialday_date formatting follows the rules set in 4.1.6.1 for date;
- the range of the day_id shall match the length of the bit-string exec_specdays in the related object of IC “Schedule”.

Что это значит?

array spec_day_entry

Ответ содержит array, внутри которого структуры spec_day_entry, формат структуры

spec_day_entry ::= structure 
{ 
index: long-unsigned, 
specialday_date: octet-string, 
day_id: unsigned 
}

рамерность и прочее описание этих типов данных смотрите в той же синей книге.

Но это не всё. Смотрим на ответ счётчика:

01 0B 02 03 12 00 01 09 05 07 E2 01 01 FF 11 02 02 03 12 00
02 09 05 07 E2 01 02 FF 11 02 02 03 12 00 03 09 05 07 E2 01
03 FF 11 02 02 03 12 00 04 09 05 07 E2 01 14 FF 11 01 02 03
12 00 05 09 05 07 E2 02 0A FF 11 01 02 03 12 00 06 09 05 07
E2 02 17 FF 11 02 02 03 12 00 07 09 05 07 E2 03 08 FF 11 02
02 03 12 00 08 09 05 07 E2 03 09 FF 11 02 02 03 12 00 09 09
05 07 E2 05 01 FF 11 02 02 03 12 00 0A 09 05 07 E2 05 02 FF
11 02 02 03 12 00 0B 09 05 07 E2 05 09 FF 11 02

Для того чтобы объяснить на примере, разобью байты

01 0B
  02 03
    12 	00 01 
    09 05 	07 E2 01 01 FF 
    11 	02 
  02 03 
    12 	00 02 
    09 05	07 E2 01 02 FF 
    11 	02 
  02 03 
    12 	00 03 
    09 05 	07 E2 01 03 FF 
    11 	02 
  02 03 
    12	00 04
    09 05	07 E2 01 14 FF
    11 	01

Объясняю:

//1 байт - тип данных (01 - это array)
//2 байт в случае массива - это длина массива (0B - 11 элементов)
01 0B
  //далее идут элементы массива

  //02 - тип данных (структура)
  //03 - кол-во элементов струкруты (в нашем случае - три элемента (index, date, day_id)
  02 03
    //далее идут элементы структуры
    //12 - тип данных (unsigned long - так называется двухбайтное целое без знака)
    //00 01 - значение
    12 	00 01 

    //09 - тип данных (octet byte string - набор байтов (такой тип данных для даты))
    //05 - длина octet byte string (5 байт)
    //07 E2 01 01 FF - сама байтовая строка. Нам нужно её интерпертировать как Date (формат описан в синей книге)
    09 05 	07 E2 01 01 FF 

    //11 - тип данных unsigned (целое 8 бит без знака)
    //02 - значение
    11 	02 

  //и так далее...
  02 03 
    12 	00 02 
    09 05	07 E2 01 02 FF 
    11 	02 
  02 03 
    12 	00 03 
    09 05 	07 E2 01 03 FF 
    11 	02 
  02 03 
    12	00 04
    09 05	07 E2 01 14 FF
    11 	01

 

 

Convert RSSI GSM Signal Strength to dBM

Термины

RSSI (received signal strength indicator) — Показатель уровня принимаемого сигнала.

RSSI index (он же GSM singnal strength) — индекс уровня принимаемого сигнала. Может принимать значения:

RSSI index RSSI in dBm
0  113 dBm or less
1 111 dBm
2…30 109… 53 dBm
31 51 dBm or greater
99 not known or not detectable

Формулы для конвертации

(1) percentage = rssi * 100 / max_rssi

rssi — RSSI как индекс (от 0 до 31)
max_rssi = 31
percentage = процентный показатель уровня принимаемого сигнала

(2) dBm = 2 * rssi — 113

Подсмотрел здесь:
https://together.jolla.com/question/117679/how-can-one-retrieve-rxlev-dbm-signal-strength-value/
http://m2msupport.net/m2msupport/atcsq-signal-quality/

Python памятка

Дата, время, текущая дата

from datetime import datetime, date, time
datetime.now().year #получить текущий год

Исключения: обработка и генерация

Бросить исключение:

raise MyError("Текст сообщения")

Форматирование строк

Во первых тебе нужно помучиться и почитать справку к языку
The Python Standard Library > Text Processing Services > Format String Syntax

Дополнение лидирующими нолями:

day = 7
"{:03}".format(day)

> 007

где  { [имя_поля] : [спецификатор_форматирования] }
наш спецификатор "03", "0" - символ дополнения, "3" - ширина в три символа

 

 

 

 

Как экспортировать настройки WiFi и затем импортировать их, то есть перенести с одной системы на другую (Windows 7,8,10)

  1. Запусти консоль с правами администратора
  2. Перейди в каталог, в который будут сохранены файлы с конфигурацией всех профилей твоих wifi сетей.
  3. В консоли выполни netsh wlan export profile key=clear (экспорт всех профилей (в файле экспорта будет виден пароль)).
  4. Для импорта netsh wlan add имя_профиля. (как импортировать все профили одной командой я пока не разбирался).

P.S. Но всё равно это не помогло. Часть профилей сохраняется с зашифрованными паролями. Решил задачу с помощью программы Smart WiFi Solution

P.P.S. Этот Smart WiFi Solution тоже не помог. В следующий раз буду делать руками, либо поищу рабочие способы автоматического бэкапа.

Как сделать сноски в WordPress

Если вам понадобилось добавить сноски в записях WordPress, то простой плагин Simple Footnotes прекрасно с этим справится.

С помощью плагина Simple Footnotes авторы могут добавлять сноски в статьях и страницах WordPress простым шорткодом [ref]. Никаких дополнительных параметров к шорткоду не требуется: Читать далее «Как сделать сноски в WordPress»

Как заменить стандартный текст «Читать далее…» и превью статьи в WordPress

Тег <!—more—> отделяет анонс статьи от её содержания.

То что написано до тега <!—more—> отображается на главной странице, а в месте тега <!—more—> вставляет текст наподобие «читать далее…» . Чтобы изменить этот текст «Читать далее» не нужно править код темы. Изменяется этот текст легко и просто, и для каждой статьи он может быть своим:

<!--more Твой текст-->

Заменяет стандартный текст на любой другой. Обрати внимание, в каком месте тега нужно написать текст.

Другая малоизвестная возможность (возможно она даже задокументирована, но кто читает документацию?) — отделить анонс от статьи. То есть в превью ты напишешь одно, а когда перейдёшь в статью, то превью ты уже не увидишь. Такой принцип был использован при написании сайта radhagovinda.ru образца 2012 года.

Тег <!—noteaser—> можно вставлять в любое место статьи.

Здесь у нас будет анонс только для главной страницы
<!--more-->
<!--noteaser-->
А в этой части текст, который будет отображаться внутри статьи,
за исключением верхнего текста

А ну ка… что там есть интересного?

Как разбить статью на страницы в WordPress

Для того, чтобы опубликовать большой текст и твоя статья при этом не превратилась в портянку на 5-100 страниц, ты можешь воспользоваться родным механизмом WordPress. Это тег:

<!--nextpage-->

Его удобно использовать, если нужно опубликовать длинную статью или книгу. Читать далее «Как разбить статью на страницы в WordPress»