Zgodnie z dokumentacją ObjectId , ten ciąg, który widzisz, jest szesnastkową reprezentacją 12 bajtów. To nie jest Unicode ani nawet ciąg znaków. To właściwie liczba.
Bajt to 8 bitów, co oznacza, że może mieć 2^8 ==256 możliwych wartości (patrz Byte ).
Jak zwięźle przedstawić liczbę z 256 możliwymi wartościami? A co powiesz na przedstawienie go jako 16^2? Możesz to osiągnąć, używając 2 wartości szesnastkowych (podstawa 16). Jedyne, co musisz wymyślić, to system numeracji, który idzie do 16 zamiast 10.
W rzeczywistości używamy liter z a
do f
do reprezentowania wartości od 10 do 15.
W ten sposób jeden bajt może być reprezentowany przez dwie liczby szesnastkowe. Tak się składa, że używa się a
do f
ponieważ nie mogliśmy zawracać sobie głowy wymyślaniem dla nich specjalnych symboli. To nie są litery. To są liczby.
Więc nie, ciąg, który widzisz w ObjectId, nie reprezentuje 24 bajtów. Zamiast tego każde 2 znaki reprezentują bajt. 24 liczby szesnastkowe ==12 bajtów.