A method comprising: receiving from a host computing device a read request referencing a particular compressed logical block of a plurality of compressed logical blocks of a page of data in a non-volatile storage medium, the page comprising a header codeword comprising a plurality of headers, respective ones of the headers corresponding to respective ones of the compressed logical blocks and each respective header including an identifier of the corresponding compressed logical block and a length of the corresponding compressed logical block; reading the page from the non-volatile storage medium responsive to the read request and storing the page in an internal buffer; decoding the header codeword to obtain the plurality of headers; determining an end of the header codeword; obtaining the lengths of the respective compressed logical blocks preceding the particular compressed logical block from the respective headers; summing the lengths of the respective compressed logical blocks preceding the particular compressed logical block to the end of the header codeword to obtain an offset that identifies a start of the particular compressed logical block; reading a length of the particular compressed logical block from the header corresponding to the particular compressed logical block; reading the particular compressed logical block from the internal buffer by reading a number of bits corresponding to the length of the particular compressed logical block beginning from the identified start of the particular compressed logical block; and decoding the read particular compressed logical block; and returning the decoded particular compressed logical block to the host computing device. receiving from a host computing device a read request referencing a particular compressed logical block of a plurality of compressed logical blocks of a page of data in a non-volatile storage medium, the page comprising a header codeword comprising a plurality of headers, respective ones of the headers corresponding to respective ones of the compressed logical blocks and each respective header including an identifier of the corresponding compressed logical block and a length of the corresponding compressed logical block; reading the page from the non-volatile storage medium responsive to the read request and storing the page in an internal buffer; decoding the header codeword to obtain the plurality of headers; determining an end of the header codeword; obtaining the lengths of the respective compressed logical blocks preceding the particular compressed logical block from the respective headers; summing the lengths of the respective compressed logical blocks preceding the particular compressed logical block to the end of the header codeword to obtain an offset that identifies a start of the particular compressed logical block; reading a length of the particular compressed logical block from the header corresponding to the particular compressed logical block; reading the particular compressed logical block from the internal buffer by reading a number of bits corresponding to the length of the particular compressed logical block beginning from the identified start of the particular compressed logical block; and decoding the read particular compressed logical block; and returning the decoded particular compressed logical block to the host computing device.