https://teknokoodiradio.vuodatus.net/lue/2018/06/investigating-pocsag-with-gnu-radio-python

<!DOCTYPE html>
<html lang="en-US">
<head>
<title>POCSAG</title>
<meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1">

<style>
p {
    display: block;
    margin-top: 5px;
    margin-bottom: 0;
    margin-left: 0;
    margin-right: 0;
}
</style>

<script>
var openFile = function(event) {
var input = event.target;

var reader = new FileReader();
reader.onload = function(){
var text = reader.result;
var node = document.getElementById('output');
text = text.replace(/\n|\r/g, "");
text = text.trim();
var d = "";
var p = 0;
var PREAMBLE = "";
var PREAMBLE_LEN = 576;
var FSC_LEN = 32;
var ADDR_CODEWORD = "0";
var MSG_CODEWORD = "1";
var FSC = "01111100110100100001010111011000", IDLE = "01111010100010011100000110010111";
for (p = 0; p < PREAMBLE_LEN / FSC_LEN; p++) {
    PREAMBLE += "10101010101010101010101010101010";
}
var i = 0;
var preambles = [];
p = text.indexOf(PREAMBLE);
while (p > -1) {
    preambles[i] = p;
    i++;
    p = text.indexOf(PREAMBLE, p + PREAMBLE_LEN);
}
if (i > 0) {
    preambles[i] = text.length;
    var l = preambles.length - 1;
    var fl = 0;
    var frames = "";
    var codeword = "";
    var codeword_msg = "";
    var fsc_found = false;
    for (i = 0; i < l; i++) {
        d += '<p><font color="Black">Preamble ' + text.substr(preambles[i], PREAMBLE_LEN) + '</font></p>';
        frames = text.substring(preambles[i] + PREAMBLE_LEN, preambles[i + 1]);
        fl = frames.length;
        fsc_found = false;
        for (p = 0; p < fl; p += FSC_LEN) {
            codeword = frames.substr(p, FSC_LEN);
            if (codeword == FSC) {
                fsc_found = true;
                d += '<p><font color="BlueViolet">Frame sync ' + codeword + '</font></p>';
            }
            else if (codeword == IDLE) {
                d += '<p><font color="Brown">Idle ' + codeword + '</font></p>';
            }
            else if ((codeword.substr(0, 1) == ADDR_CODEWORD) && (fsc_found)) {
                d += '<p><font color="DarkGreen">Address ' + codeword + '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0, address 0x' + parseInt(codeword.substr(1, 18), 2).toString(16) + ', function bits 0x' + parseInt(codeword.substr(19, 2), 2).toString(16) + ', parity check bits 0x' + parseInt(codeword.substr(21, 10), 2).toString(16) + ', even parity bit ' + codeword.substr(31, 1) + '</font></p>';
            }
            else if ((codeword.substr(0, 1) == MSG_CODEWORD) && (fsc_found)) {
                codeword_msg = codeword.substr(1, 20);
                d += '<p><font color="Blue">Message ' + codeword + '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1, message ' + codeword_msg + ' (0x' + parseInt(codeword_msg, 2).toString(16) +')' + ', parity check bits 0x' + parseInt(codeword.substr(21, 10), 2).toString(16) + ', even parity bit ' + codeword.substr(31, 1) + '</font></p>';
            }
        }
        d += '<br><br>';
    }
}
if (d.length > 0) {
    node.innerHTML = d;
}
};
reader.readAsText(input.files[0]);
};
</script>

</head>
<body>
<h2>POCSAG</h2>
<input type='file' accept='text/plain' onchange='openFile(event)'><br>
<hr>
<div id="output"></div>
</body>
</html>

jspoc.jpg

https://ibb.co/gVkxoz

T-SQL

SET NOCOUNT ON

declare @DEBUG bit = 'FALSE'

declare @PREAMBLE_LEN int = 576
declare @CODEWORD_LEN int = 32
declare @ADDR_CODEWORD varchar(1) = '0'
declare @MSG_CODEWORD varchar(1) = '1'
declare @FRAME_SYNC varchar(32) = '01111100110100100001010111011000'
declare @IDLE_CODEWORD varchar(32) = '01111010100010011100000110010111'
declare @PREAMBLE_DATA varchar(32) = '10101010101010101010101010101010'

declare @preamble varchar(576) = ''
declare @p int = 0
declare @i int = 0
declare @l int = 0
declare @fl int = 0
declare @ds int = 0
declare @de int = 0
declare @frames varchar(4096) = ''
declare @fsc_found bit = 'FALSE'
declare @codeword varchar(32) = ''
declare @pocsag varchar(MAX) = ''

declare @preamble_idx table
(
    n    int identity(1, 1),
    idx    int
)

declare @raw_data varchar(MAX)

SET @raw_data =
'
10101010101010101010101010101010
10101010101010101010101010101010
10101010101010101010101010101010
10101010101010101010101010101010
10101010101010101010101010101010
10101010101010101010101010101010
10101010101010101010101010101010
10101010101010101010101010101010
10101010101010101010101010101010
10101010101010101010101010101010
10101010101010101010101010101010
10101010101010101010101010101010
10101010101010101010101010101010
10101010101010101010101010101010
10101010101010101010101010101010
10101010101010101010101010101010
10101010101010101010101010101010
10101010101010101010101010101010
01111100110100100001010111011000
0000000000000000001001010101010110000000000000000110010101010101
1000000000000000011001010101010110000000000000000110010101010101
0000000000000000111001010101010110000000000000000110010101010101
0000000000000001111001010101010110000000000000000110010101010101
0000000000000001001001010101010110000000000000000110010101010101
0000000000000000101001010101010110000000000000000110010101010101
0000000000000010001001010101010110000000000000000110010101010101
1000000000000000011001010101010110000000000000000110010101010101
10101010101010101010101010101010
10101010101010101010101010101010
10101010101010101010101010101010
10101010101010101010101010101010
10101010101010101010101010101010
10101010101010101010101010101010
10101010101010101010101010101010
10101010101010101010101010101010
10101010101010101010101010101010
10101010101010101010101010101010
10101010101010101010101010101010
10101010101010101010101010101010
10101010101010101010101010101010
10101010101010101010101010101010
10101010101010101010101010101010
10101010101010101010101010101010
10101010101010101010101010101010
10101010101010101010101010101010
01111100110100100001010111011000
0000000000000000001001010101010101111010100010011100000110010111
1000000000000000011001010101010101111010100010011100000110010111
0000000000000000001001010101010101111010100010011100000110010111
1000000000000001111001010101010101111010100010011100000110010111
0000000000000000001001010101010101111010100010011100000110010111
1000000000000000101001010101010101111010100010011100000110010111
1000000000000010001001010101010101111010100010011100000110010111
1000000000000011001001010101010101111010100010011100000110010111
'

PRINT 'Raw data  ' + @raw_data
SET @raw_data = REPLACE(REPLACE(@raw_data, CHAR(13), ''), CHAR(10), '')

SET @fl = @PREAMBLE_LEN / @CODEWORD_LEN
WHILE (@p < @fl)
BEGIN
    SET @preamble += @PREAMBLE_DATA
    SET @p += 1
END
PRINT CHAR(13) + 'Preamble  ' + @preamble

SET @p = CHARINDEX(@PREAMBLE_DATA, @raw_data)
WHILE (@p > 0)
BEGIN
    INSERT INTO @preamble_idx(idx) VALUES (@p)
    SET @p = CHARINDEX(@PREAMBLE_DATA, @raw_data, @p + @PREAMBLE_LEN)
    SET @i += 1
END

IF (@i > 0)
BEGIN
    INSERT INTO @preamble_idx(idx) VALUES (LEN(@raw_data))
    IF (@DEBUG = 'TRUE') SELECT n, idx FROM @preamble_idx
    SELECT @l = COUNT(*) FROM @preamble_idx
    SET @i = 1
    WHILE (@i < @l)
    BEGIN
        SELECT @ds = idx FROM @preamble_idx WHERE n = @i
        SELECT @de = idx FROM @preamble_idx WHERE n = @i + 1
        SET @frames = SUBSTRING(@raw_data, @ds + @PREAMBLE_LEN, @de)
        IF (@DEBUG = 'TRUE') SELECT @frames AS 'frame'
        SET @fl = LEN(@frames)
        SET @fsc_found = 'FALSE'
        SET @p = 1
        WHILE (@p < @fl)
        BEGIN
            SET @codeword = SUBSTRING(@frames, @p, @CODEWORD_LEN)
            IF (@codeword = @FRAME_SYNC)
            BEGIN
                SET @fsc_found = 'TRUE'
                SET @pocsag += 'Frame sync ' + @codeword + CHAR(13)
            END
            ELSE IF (@codeword = @IDLE_CODEWORD)
            BEGIN
                SET @pocsag += 'Idle codeword ' + @codeword + CHAR(13)
            END
            ELSE IF ((SUBSTRING(@codeword, 1, 1) = @ADDR_CODEWORD) AND (@fsc_found = 'TRUE'))
            BEGIN
                SET @pocsag += 'Address codeword ' + @codeword + '    address ' + SUBSTRING(@codeword, 2, 18) + '    paging source (function bits) ' + SUBSTRING(@codeword, 20, 2) + '    parity check bits ' + SUBSTRING(@codeword, 22, 10) + '    even parity bit ' + SUBSTRING(@codeword, 32, 1) + CHAR(13)
            END
            ELSE IF ((SUBSTRING(@codeword, 1, 1) = @MSG_CODEWORD) AND (@fsc_found = 'TRUE'))
            BEGIN
                SET @pocsag += 'Message codeword ' + @codeword + '    message ' + SUBSTRING(@codeword, 2, 20) + '    parity check bits ' + SUBSTRING(@codeword, 22, 10) + '    even parity bit ' + SUBSTRING(@codeword, 32, 1) + CHAR(13)
            END
            SET @p += @CODEWORD_LEN
        END
        SET @i += 1
    END
    IF (@pocsag <> '') PRINT @pocsag
END

tsqlpoc.jpg
https://ibb.co/iRjCUe