Communities

Writing
Writing
Codidact Meta
Codidact Meta
The Great Outdoors
The Great Outdoors
Photography & Video
Photography & Video
Scientific Speculation
Scientific Speculation
Cooking
Cooking
Electrical Engineering
Electrical Engineering
Judaism
Judaism
Languages & Linguistics
Languages & Linguistics
Software Development
Software Development
Mathematics
Mathematics
Christianity
Christianity
Code Golf
Code Golf
Music
Music
Physics
Physics
Linux Systems
Linux Systems
Power Users
Power Users
Tabletop RPGs
Tabletop RPGs
Community Proposals
Community Proposals
tag:snake search within a tag
answers:0 unanswered questions
user:xxxx search by author id
score:0.5 posts with 0.5+ score
"snake oil" exact phrase
votes:4 posts with 4+ votes
created:<1w created < 1 week ago
post_type:xxxx type of post
Search help
Notifications
Mark all as read See all your notifications »
Q&A

Welcome to Software Development on Codidact!

Will you help us build our independent community of developers helping developers? We're small and trying to grow. We welcome questions about all aspects of software development, from design to code to QA and more. Got questions? Got answers? Got code you'd like someone to review? Please join us.

Post History

66%
+2 −0
Q&A Extracting Firefox Local Data

Having looked up how Snappy compression works, I'm going to upgrade my comment to an answer as I'm almost certain this is what's happening. Based on the Firefox source code, it inserts LSValues wh...

posted 3d ago by Derek Elkins‭

Answer
#1: Initial revision by user avatar Derek Elkins‭ · 2025-05-11T03:50:21Z (3 days ago)
Having looked up how Snappy compression works, I'm going to upgrade my comment to an answer as I'm almost certain this is what's happening.

Based on the Firefox source code, it [inserts](https://github.com/mozilla-firefox/firefox/blob/main/dom/localstorage/ActorsParent.cpp#L3720) [`LSValue`s](https://github.com/mozilla-firefox/firefox/blob/main/dom/localstorage/LSValue.h#L37) which are strings with some meta-information specifying how they should be stored. Relevant here is the `CompressionType` which can either be `UNCOMPRESSED` or `SNAPPY`. This gets stored in the `data` table as the `compression_type` field with a value of 1 indicating Snappy compression.

[Snappy compression](https://en.wikipedia.org/wiki/Snappy_(compression)) is a relatively simple byte-oriented, dictionary-based compression algorithm. The compressed output consists of a sequence of elements which are either uncompressed parts of the input, or references to spans of decompressed output. The "opaque binary sequences" you're seeing are almost certainly the tags for the elements (which is all there is of a reference element).

To specifically answer your question, to read the `value` field of a row in the `data` table, you need to take into account the `conversion_type` field and the `compression_type` field. If the `compression_type` field is 1, then the value needs to be decompressed with the Snappy algorithm first. If it is 0, then it is not compressed. After that, the `conversion_type` indicates whether the data is stored as UTF-8 or UTF-16. If `conversion_type` is 1 then the data is stored as UTF-8, otherwise it's stored as UTF-16.