<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.lumasworkshop.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Lord-Giganticus</id>
	<title>Luma&#039;s Workshop - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://www.lumasworkshop.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Lord-Giganticus"/>
	<link rel="alternate" type="text/html" href="https://www.lumasworkshop.com/wiki/Special:Contributions/Lord-Giganticus"/>
	<updated>2026-06-04T06:17:58Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>https://www.lumasworkshop.com/w/index.php?title=BCSV_(File_format)&amp;diff=795</id>
		<title>BCSV (File format)</title>
		<link rel="alternate" type="text/html" href="https://www.lumasworkshop.com/w/index.php?title=BCSV_(File_format)&amp;diff=795"/>
		<updated>2025-01-11T17:28:23Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: /* Field Order &amp;amp; Entry Size */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:File formats]]&lt;br /&gt;
{{Finished}}&lt;br /&gt;
&#039;&#039;&#039;BCSV&#039;&#039;&#039; stands for &#039;&#039;&#039;B&#039;&#039;&#039;inary &#039;&#039;&#039;C&#039;&#039;&#039;omma &#039;&#039;&#039;S&#039;&#039;&#039;eparated &#039;&#039;&#039;V&#039;&#039;&#039;alues and is the most common data format used in both Super Mario Galaxy games. Some older GameCube titles, such as &#039;&#039;Luigi&#039;s Mansion&#039;&#039; and &#039;&#039;Donkey Kong Jungle Beat&#039;&#039;, use this data format as well. As the name suggests, BCSV is a binary variant of comma-separated values (CSV). This means that the data is laid out in a table-like structure. The column names are hashed for faster access. The data is flatbuffer-like and is loaded directly into memory, meaning that it does not have to be deserialized first. The game supports reading data as signed and unsigned integers (8, 16 and 32 bit), single-precision floats and strings.&lt;br /&gt;
All BCSV files are padded to the nearest 32 byte boundary with &#039;@&#039; (0x40). There is no consistent file extension for BCSV data. Instead, the game contains various BCSV, BANMT, BCAM, PA and TBL files. BCSV files that use &#039;&#039;TBL&#039;&#039; as their file extension are expected to be sorted in ascending order by some specific field. Each string is a null-terminated &#039;&#039;SHIFT-JIS (Codepage 932)&#039;&#039; encoded string.&lt;br /&gt;
&lt;br /&gt;
==Header==&lt;br /&gt;
Each BCSV file starts with a header:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! Offset !! Type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || u32 || Entry count&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || u32 || Field count&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || u32 || Offset to the entry data section&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || u32 || The size of each entry in bytes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Fields Section==&lt;br /&gt;
Right after the header comes the list of fields. The structure of a single field is as follows:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! Offset !! Type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || u32 || Name hash&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || u32 || Bitmask (often the data type&#039;s max value)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || u16 || Offset to the data under this field in an individual entry&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A || u8 || Data shift amount&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B || u8 || The type of data that this field uses&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Data types===&lt;br /&gt;
Fields may cover one of the following data types:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! Name !! ID !! Size (in bytes) !! Description&lt;br /&gt;
|-&lt;br /&gt;
| LONG || 0x00 || 4 || 32-bit integer. Signedness is not specified. ANDed with the bitmask and shifted right by the field&#039;s shift amount.&lt;br /&gt;
|-&lt;br /&gt;
| STRING || 0x01 || 32 || Embedded string. &#039;&#039;&#039;Deprecated&#039;&#039;&#039;. Use &#039;&#039;STRING_OFFSET&#039;&#039; instead.&lt;br /&gt;
|-&lt;br /&gt;
| FLOAT || 0x02 || 4 || Single-precision floating-point value.&lt;br /&gt;
|-&lt;br /&gt;
| LONG_2 || 0x03 || 4 || 32-bit integer. Signedness is not specified. ANDed with the bitmask and shifted right by the field&#039;s shift amount.&lt;br /&gt;
|-&lt;br /&gt;
| SHORT || 0x04 || 2 || 16-bit integer. Signedness is not specified. ANDed with the bitmask and shifted right by the field&#039;s shift amount.&lt;br /&gt;
|-&lt;br /&gt;
| CHAR || 0x05 || 1 || 8-bit integer. Signedness is not specified. ANDed with the bitmask and shifted right by the field&#039;s shift amount.&lt;br /&gt;
|-&lt;br /&gt;
| STRING_OFFSET || 0x06 || 4 || 32-bit offset into string table.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
It&#039;s debated that there may be a NULL data type (ID of 7) but there is no way of confirming this info at the time.&lt;br /&gt;
&lt;br /&gt;
===Field Order &amp;amp; Entry Size===&lt;br /&gt;
For efficiency and hardware limitations, the field offsets and total entry size are calculated depending on a special ordering of the fields. This only affects the order of the data in an entry and not the order of the fields in this section. When saving, the tool should ensure that the field offsets and total entry size are calculated depending on this order: STRING &amp;lt; FLOAT &amp;lt; LONG &amp;lt; LONG_2 &amp;lt; SHORT &amp;lt; CHAR &amp;lt; STRING_OFFSET. A sample implementation from [https://github.com/SunakazeKun/pyjmap/blob/main/pyjmap/jmap.py#L750 pyjmap can be found on Github] which shows how to calculate these properly.&lt;br /&gt;
Another sample would be [https://github.com/Lord-G-INC/libbcsv/blob/main/src/types.rs#L65 from libbcsv] which shows the order of the data types.&lt;br /&gt;
&lt;br /&gt;
==Data Section==&lt;br /&gt;
Contains the individual data entries. The structure of their data is specified by the BCSV&#039;s fields. Each entry is aligned to four bytes. When saving, the tool should ensure that they are written based off the Field Order. The amount of data entries should be &amp;lt;code&amp;gt;header.entrycount * header.fieldcount&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==String Pool==&lt;br /&gt;
Right after the data comes the string pool which contains all strings used within the BCSV. Here are some rules regarding the string pool:&lt;br /&gt;
* ALWAYS starts directly after the Data Section.&lt;br /&gt;
* String entries are UNIQUE.&lt;br /&gt;
* String entries are NUL terminated.&lt;br /&gt;
* It should always be possible to find the table&#039;s start by using &amp;lt;code&amp;gt;header.entrydataoff + header.entrycount * header.entrysize&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://www.lumasworkshop.com/w/index.php?title=BMG_(File_Format)&amp;diff=580</id>
		<title>BMG (File Format)</title>
		<link rel="alternate" type="text/html" href="https://www.lumasworkshop.com/w/index.php?title=BMG_(File_Format)&amp;diff=580"/>
		<updated>2024-07-10T21:00:11Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: /* Header */  Fix red link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:File formats]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BMG&#039;&#039;&#039; is a file format used to hold text in SMG1. This was replaced by the [[MSBT]] file format in SMG2. Unlike the messages in SMG2, SMG1 uses a single, region specific BMG file (Region/message.arc/message.bmg) to hold &#039;&#039;ALL&#039;&#039; text.&lt;br /&gt;
&lt;br /&gt;
= Format Specifications =&lt;br /&gt;
Below you&#039;ll find helpful tables on how the file is structured. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;THIS IS SPECIFIC TO SMG1/3D All Stars. Other games that use BMG might be different!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;All Char[] types are in ASCII encoding.&#039;&#039;&lt;br /&gt;
== Header ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! Offset !! Type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Char[4] || File magic. &amp;quot;MESG&amp;quot; for SMG1, &amp;quot;GSEM&amp;quot; for 3D All Stars.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4 || Char[4] || File magic. &amp;quot;bmg1&amp;quot; for SMG1. &amp;quot;1gmb&amp;quot; for 3D All Stars.&lt;br /&gt;
|-&lt;br /&gt;
| 0x8 || UInt32 || [[BMG_(File_Format)#FLW1|FLW1 Section]] Offset.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || UInt32 || Section Number.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || UInt8 || Unknown. Believed to be a definition of encoding in some games.&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || UInt8[15] || Padding.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Section Base ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Char[4] || Magic. Relates to the Section Type it is.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4 || UInt32 || Section Size.&lt;br /&gt;
|}&lt;br /&gt;
== Section Types ==&lt;br /&gt;
This is where things get a little weird. Depending on the Magic from the [[BMG (File Format)#Section_Base|Section Base]], it can be one of the following types below.&lt;br /&gt;
=== INF1 Section ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || UInt16 || Section Number.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || UInt16 || Section Size.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4 || UInt8[4] || Padding.&lt;br /&gt;
|}&lt;br /&gt;
=== DAT1 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || UInt8[] || Section Data, determined by Section Size. Contains wchar_t strings.&lt;br /&gt;
|}&lt;br /&gt;
=== FLW1 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || UInt16 || Node Number.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || UInt16 || Brach Node Number.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4 || UInt8[4] || Padding.&lt;br /&gt;
|}&lt;br /&gt;
=== FLI1 ===&lt;br /&gt;
&#039;&#039;&#039; Not used/supported in SMG1/3D All Stars.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Tools =&lt;br /&gt;
The following tools can handle SMG1&#039;s BMG (some may have 3D All Stars support, but most don&#039;t.)&lt;br /&gt;
* [http://wiki.tockdom.com/wiki/Wiimms_SZS_Tools Wiimms SZS Tools (wbmgt)] (Can convert a BMG to a TXT file. High chance of crashing if you edit with this.)&lt;br /&gt;
* [https://github.com/ZyphronG/Tomato Tomato] (Can convert a BMG + the [[BCSV|TBL]] file to a XML file and vise versa. &#039;&#039;&#039;Has 3D All Stars Support&#039;&#039;&#039;)&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://www.lumasworkshop.com/w/index.php?title=BMG_(File_Format)&amp;diff=579</id>
		<title>BMG (File Format)</title>
		<link rel="alternate" type="text/html" href="https://www.lumasworkshop.com/w/index.php?title=BMG_(File_Format)&amp;diff=579"/>
		<updated>2024-07-10T20:59:15Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: /* Section Types */ Document DAT1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:File formats]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BMG&#039;&#039;&#039; is a file format used to hold text in SMG1. This was replaced by the [[MSBT]] file format in SMG2. Unlike the messages in SMG2, SMG1 uses a single, region specific BMG file (Region/message.arc/message.bmg) to hold &#039;&#039;ALL&#039;&#039; text.&lt;br /&gt;
&lt;br /&gt;
= Format Specifications =&lt;br /&gt;
Below you&#039;ll find helpful tables on how the file is structured. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;THIS IS SPECIFIC TO SMG1/3D All Stars. Other games that use BMG might be different!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;All Char[] types are in ASCII encoding.&#039;&#039;&lt;br /&gt;
== Header ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! Offset !! Type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Char[4] || File magic. &amp;quot;MESG&amp;quot; for SMG1, &amp;quot;GSEM&amp;quot; for 3D All Stars.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4 || Char[4] || File magic. &amp;quot;bmg1&amp;quot; for SMG1. &amp;quot;1gmb&amp;quot; for 3D All Stars.&lt;br /&gt;
|-&lt;br /&gt;
| 0x8 || UInt32 || [[BMG#FLW1|FLW1 Section]] Offset.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || UInt32 || Section Number.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || UInt8 || Unknown. Believed to be a definition of encoding in some games.&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || UInt8[15] || Padding.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Section Base ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || Char[4] || Magic. Relates to the Section Type it is.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4 || UInt32 || Section Size.&lt;br /&gt;
|}&lt;br /&gt;
== Section Types ==&lt;br /&gt;
This is where things get a little weird. Depending on the Magic from the [[BMG (File Format)#Section_Base|Section Base]], it can be one of the following types below.&lt;br /&gt;
=== INF1 Section ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || UInt16 || Section Number.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || UInt16 || Section Size.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4 || UInt8[4] || Padding.&lt;br /&gt;
|}&lt;br /&gt;
=== DAT1 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || UInt8[] || Section Data, determined by Section Size. Contains wchar_t strings.&lt;br /&gt;
|}&lt;br /&gt;
=== FLW1 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || UInt16 || Node Number.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || UInt16 || Brach Node Number.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4 || UInt8[4] || Padding.&lt;br /&gt;
|}&lt;br /&gt;
=== FLI1 ===&lt;br /&gt;
&#039;&#039;&#039; Not used/supported in SMG1/3D All Stars.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Tools =&lt;br /&gt;
The following tools can handle SMG1&#039;s BMG (some may have 3D All Stars support, but most don&#039;t.)&lt;br /&gt;
* [http://wiki.tockdom.com/wiki/Wiimms_SZS_Tools Wiimms SZS Tools (wbmgt)] (Can convert a BMG to a TXT file. High chance of crashing if you edit with this.)&lt;br /&gt;
* [https://github.com/ZyphronG/Tomato Tomato] (Can convert a BMG + the [[BCSV|TBL]] file to a XML file and vise versa. &#039;&#039;&#039;Has 3D All Stars Support&#039;&#039;&#039;)&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
	<entry>
		<id>https://www.lumasworkshop.com/w/index.php?title=BCSV_(File_format)&amp;diff=147</id>
		<title>BCSV (File format)</title>
		<link rel="alternate" type="text/html" href="https://www.lumasworkshop.com/w/index.php?title=BCSV_(File_format)&amp;diff=147"/>
		<updated>2024-04-04T20:11:36Z</updated>

		<summary type="html">&lt;p&gt;Lord-Giganticus: update this a bit sense it was a tad old&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:File formats]]&lt;br /&gt;
{{Finished}}&lt;br /&gt;
&#039;&#039;&#039;BCSV&#039;&#039;&#039; stands for &#039;&#039;&#039;B&#039;&#039;&#039;inary &#039;&#039;&#039;C&#039;&#039;&#039;omma &#039;&#039;&#039;S&#039;&#039;&#039;eparated &#039;&#039;&#039;V&#039;&#039;&#039;alues and is the most common data format used in both Super Mario Galaxy games. Some older GameCube titles, such as &#039;&#039;Luigi&#039;s Mansion&#039;&#039; and &#039;&#039;Donkey Kong Jungle Beat&#039;&#039;, use this data format as well. As the name suggests, BCSV is a binary variant of comma-separated values (CSV). This means that the data is laid out in a table-like structure. The column names are hashed for faster access. The data is flatbuffer-like and is loaded directly into memory, meaning that it does not have to be deserialized first. The game supports reading data as signed and unsigned integers (8, 16 and 32 bit), single-precision floats and strings.&lt;br /&gt;
All BCSV files are padded to the nearest 32 byte boundary with &#039;@&#039; (0x40). There is no consistent file extension for BCSV data. Instead, the game contains various BCSV, BANMT, BCAM, PA and TBL files. BCSV files that use &#039;&#039;TBL&#039;&#039; as their file extension are expected to be sorted in ascending order by some specific field. Each string is a null-terminated &#039;&#039;SHIFT-JIS (Codepage 932)&#039;&#039; encoded string.&lt;br /&gt;
&lt;br /&gt;
==Header==&lt;br /&gt;
Each BCSV file starts with a header:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! Offset !! Type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || u32 || Entry count&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || u32 || Field count&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || u32 || Offset to the entry data section&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || u32 || The size of each entry in bytes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Fields Section==&lt;br /&gt;
Right after the header comes the list of fields. The structure of a single field is as follows:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! Offset !! Type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || u32 || Name hash&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || u32 || Bitmask (often the data type&#039;s max value)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || u16 || Offset to the data under this field in an individual entry&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A || u8 || Data shift amount&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B || u8 || The type of data that this field uses&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Data types===&lt;br /&gt;
Fields may cover one of the following data types:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
! Name !! ID !! Size (in bytes) !! Description&lt;br /&gt;
|-&lt;br /&gt;
| LONG || 0x00 || 4 || 32-bit integer. Signedness is not specified. ANDed with the bitmask and shifted right by the field&#039;s shift amount.&lt;br /&gt;
|-&lt;br /&gt;
| STRING || 0x01 || 32 || Embedded string. &#039;&#039;&#039;Deprecated&#039;&#039;&#039;. Use &#039;&#039;STRING_OFFSET&#039;&#039; instead.&lt;br /&gt;
|-&lt;br /&gt;
| FLOAT || 0x02 || 4 || Single-precision floating-point value.&lt;br /&gt;
|-&lt;br /&gt;
| LONG_2 || 0x03 || 4 || 32-bit integer. Signedness is not specified. ANDed with the bitmask and shifted right by the field&#039;s shift amount.&lt;br /&gt;
|-&lt;br /&gt;
| SHORT || 0x04 || 2 || 16-bit integer. Signedness is not specified. ANDed with the bitmask and shifted right by the field&#039;s shift amount.&lt;br /&gt;
|-&lt;br /&gt;
| CHAR || 0x05 || 1 || 8-bit integer. Signedness is not specified. ANDed with the bitmask and shifted right by the field&#039;s shift amount.&lt;br /&gt;
|-&lt;br /&gt;
| STRING_OFFSET || 0x06 || 4 || 32-bit offset into string table.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
It&#039;s debated that there may be a NULL data type (ID of 7) but there is no way of confirming this info at the time.&lt;br /&gt;
&lt;br /&gt;
===Field Order &amp;amp; Entry Size===&lt;br /&gt;
For efficiency and hardware limitations, the field offsets and total entry size are calculated depending on a special ordering of the fields. This only affects the order of the data in an entry and not the order of the fields in this section. When saving, the tool should ensure that the field offsets and total entry size are calculated depending on this order: STRING &amp;lt; FLOAT &amp;lt; LONG &amp;lt; LONG_2 &amp;lt; SHORT &amp;lt; CHAR &amp;lt; STRING_OFFSET. A sample implementation from [https://github.com/SunakazeKun/pyjmap/blob/main/pyjmap/jmap.py#L750 pyjmap can be found on Github] which shows how to calculate these properly.&lt;br /&gt;
Another sample would be [https://github.com/Lord-G-INC/libbcsv/blob/main/src/types.rs#L56 from libbcsv] which shows the order of the data types.&lt;br /&gt;
&lt;br /&gt;
==Data Section==&lt;br /&gt;
Contains the individual data entries. The structure of their data is specified by the BCSV&#039;s fields. Each entry is aligned to four bytes. When saving, the tool should ensure that they are written based off the Field Order. The amount of data entries should be &amp;lt;code&amp;gt;header.entrycount * header.fieldcount&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==String Pool==&lt;br /&gt;
Right after the data comes the string pool which contains all strings used within the BCSV. Here are some rules regarding the string pool:&lt;br /&gt;
* ALWAYS starts directly after the Data Section.&lt;br /&gt;
* String entries are UNIQUE.&lt;br /&gt;
* String entries are NUL terminated.&lt;br /&gt;
* It should always be possible to find the table&#039;s start by using &amp;lt;code&amp;gt;header.entrydataoff + header.entrycount * header.entrysize&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Lord-Giganticus</name></author>
	</entry>
</feed>