Un archivo BJSON es en escencia la forma binaria de un JSON usado en MC3DS Edition
La primera parte del archivo es donde se define la estructura JSON, donde cada elemento se representa por un conjunto de 3 números enteros de 32 bits.
Antes inicia con un entero de 32 bits que representa la longitud de objetos que posee la estructura. Seguido de eso ya vienen los objetos en orden de la estructura original del archivo JSON.
Los tipos de datos que puede contener son los siguientes, includia su estructura.
int32 int32 int32
Data type Value 1 Value 2
int32 int32 int32
0 0 0
int32 int32 int32
1 (0|1)=(false|true) 0
int32 int32 int32
2 Value 0
int32 int32 int32
3 Value 0
int32 int32 int32
4 Lenght Objects in previous arrays
Objects in previous arrays se refiere a la cantidad de objetos que hay en arrays anteriores al momento en el que se cierra un array
int32 int32 int32
5 Hash String start position
String start position representa la posición en la que la cadena de texto inicia dentro de la siguiente sección del archivo, que es una sección que contiene todos los textos usados en la estructura, terminados con el caracter nulo
int32 int32 int32
6 Lenght Objects in previous objects
Objects in previous objects se refiere a la cantidad de objetos que hay en objetos anteriores al momento en el que se cierra un objeto
En esta sección se agrupan todas las cadenas de texto usadas en el archivo BJSON que se guardan como valores, eso significa que no incluye el texto de las cabeceras, las cuales se encuentran en otra sección.
Las cadenas de texto están terminadas por el caractér nulo.
La sección inicia con un entero de 32 bits que representa la cantidad de caracteres totales en la sección. Seguido se encuentran las cadenas de texto.
En esta sección se encuentran todos los índices de los elementos que se encuentran en un array, se encuentran agrupados según el orden en el que se hayan cerrados los arrays, lo que significa que primero van a estar los índices del primer array que haya estado y se haya cerrado primero en el archivo JSON.
Los elementos de esta sección están representados por un solo entero de 32 bits que representa el índice del elemento en la estructura, este índice se obtiene según el orden en el que haya aparecido en el JSON y es absoluto respecto a todos los demás elementos del JSON, significa que no habrán índices repetidos en esta sección nunca
La sección inicia, como en las demás, con un entero de 32 bits que representa la cantidad de índices que hay en total, en la sección.
En esta sección se encuentran definidas todos los key values o cabeceras.
Es decir, si tienes en un JSON:
{
"my_number": 2
}
"my_number" estará definido en esta sección.
El propósito de esta sección es la búsqueda rápida de información mediante el uso de keys.
Cada key tiene una estructura parecida a la de una cadena de texto:
int32 int32 int32
Index Hash String start position
Donde el índice sigue las mismas reglas de la sección anterior, hash es el protagonista de esta sección, y String start position funciona igual que en la sección de estructura, con diferencia que ahora el texto se busca en la siguiente sección.
La búsqueda de valores mediate keys se realiza usando el hash de la cadena de texto, ya que es más rápido comparar dos enteros que dos cadenas de texto. Por eso es importante el hash aquí.
Además, los keys se agrupan de igual forma que en la sección anterior, con una adición, y es que dentro de cada grupo los keys se tienen que ordenar de menor a mayor según su valor de hash. Lo cual está relacionado con algoritmos de búsqueda más eficientes.
La sección inicia con un entero de 32 bits que representa la cantidad de keys que contiene la sección
Esta sección tiene las mismas reglas que la sección de Cadenas de texto, solo que aquí se almacenan las cadenas de texto que se usan en las keys.
Inicia con un entero de 32 bits que indica la cantidad de caracteres que contiene la sección
Cada cadena está terminada por el caractér nulo
- El algoritmo para generar el hash de una cadena de texto es desconocido y debe ser el mismo que el juego usa de lo contrario podría ocurrir comportamientos inesperados
- Si un objeto o array está vacía, el valor de la sumatoria se omite y en su lugar se coloca como 0