Image default
Máy Tính

Cách Lưu Trữ File Trong Minecraft: Biến Khối Len Thành Dữ Liệu Vô Hạn

File, một khái niệm quen thuộc trong thế giới số, về cơ bản chỉ là một tập hợp các dữ liệu được tổ chức thành một mảng byte một chiều. Các hệ điều hành hiện đại thường sử dụng phần mở rộng file để xác định “loại” file, từ đó áp dụng các quy tắc để giải thích dữ liệu theo một cách có ý nghĩa. Tuy nhiên, khi nói đến việc “file” là một tập hợp dữ liệu, bản chất nó không quá đặc biệt. Bạn không cần một kiểu file cụ thể cho bất kỳ file nào; bạn có thể lưu một file JPG dưới dạng .zip, và nếu bạn ép trình chỉnh sửa ảnh mở nó, nhiều khả năng nó vẫn sẽ mở bình thường.

Với kiến thức đó, dữ liệu không phải là thứ bạn không thể biểu diễn dưới nhiều hình thức khác. Chúng tôi đã từng chứng minh cách các file có thể được lưu trữ bên trong Pokémon Emerald, và tôi quyết định đi xa hơn một bước. Điều gì sẽ xảy ra nếu chúng ta có thể lưu trữ file bên trong Minecraft? Với một thế giới vô hạn, về mặt lý thuyết, bạn có thể lưu trữ bất kỳ file nào bạn muốn trong game, miễn là bạn biết cách giải thích nó sau này. Đó chính xác là những gì tôi đã làm, và mặc dù nó khá tốn công sức, đây cũng là một cách tuyệt vời để giải thích cách dữ liệu được lưu và tham chiếu.

Hãy cùng khám phá hành trình biến những khối len đầy màu sắc trong Minecraft thành một hệ thống lưu trữ dữ liệu độc đáo, mở ra cái nhìn sâu sắc về cách các file hoạt động và cách chúng ta có thể tương tác với chúng theo những cách không ngờ tới.

Hiểu Về Bản Chất Dữ Liệu và Phương Pháp Ánh Xạ Trong Minecraft

Trước tiên, để bắt đầu hành trình lưu trữ file trong một tựa game như Minecraft, chúng ta cần hiểu rõ bản chất của dữ liệu và tìm ra một phương pháp để ánh xạ chúng một cách hiệu quả và dễ dàng truy xuất.

File: Chỉ Là Một Dòng Byte Vô Tri

Khi bạn lưu một file, dù đó là một hình ảnh, văn bản hay một chương trình, thực chất bạn đang lưu trữ một chuỗi các byte. Mỗi byte lại bao gồm 8 bit, và mỗi bit chỉ có thể là 0 hoặc 1. Khi một file được chia nhỏ, chuỗi byte này sẽ được phân thành các phân đoạn nhỏ hơn, dễ quản lý hơn. Quá trình phân chia này đảm bảo rằng mỗi phân đoạn là một tập hợp con liền kề, chính xác của chuỗi byte gốc. Về bản chất, quá trình này không làm thay đổi nội dung của các byte. Miễn là các phân đoạn này được ghép lại đúng thứ tự, file gốc có thể được tái tạo hoàn hảo.

Sức Mạnh Của 16 Màu Len: Lưu Trữ 4 Bit Dữ Liệu Cho Mỗi Khối

Với ý tưởng đó, tôi muốn tìm một cách dễ dàng để biểu diễn dữ liệu trong Minecraft theo cách có thể thu được một cách hợp pháp trong game và cũng có thể đại diện cho một lượng dữ liệu đáng kể trên mỗi khối. Một số ý tưởng phức tạp hơn tôi đã nghĩ đến bao gồm việc lột vỏ các khúc gỗ và sử dụng hướng của chúng, trong khi một ý tưởng khác sử dụng khung vật phẩm với các vật phẩm bên trong. Tuy nhiên, tôi nhận ra rằng có 16 màu len khác nhau trong game, và điều này là hoàn hảo. Không chỉ len dễ kiếm, mà việc có 16 màu cũng đồng nghĩa với việc chúng ta có thể lưu trữ bốn bit dữ liệu (một “nibble”) bên trong mỗi khối len. Điều này có nghĩa là mỗi hai khối len sẽ đại diện cho một byte dữ liệu hoàn chỉnh.

Bảng Ánh Xạ Chi Tiết: Từ Hex Đến Màu Len Trong Minecraft

Với kiến thức này, tôi đã tạo một bảng ánh xạ các chữ số thập lục phân (hex digit) và chuỗi bốn bit tương ứng với một màu len cụ thể. Bảng này sẽ là chìa khóa để chúng ta đọc và ghi dữ liệu. Đối với các file nhỏ, việc tự xây dựng các cấu trúc này là khá thực tế. Như tôi sẽ chứng minh sau, một file 67 byte sẽ sử dụng 144 khối len, trong đó mười khối chỉ là phần đệm để đảm bảo chiều cao và chiều rộng đồng đều. Xin lưu ý rằng dự án này được phát triển cho Minecraft Java Edition, không phải Bedrock Edition.

Dưới đây là bảng ánh xạ tôi đã tạo:

Chữ số Hex Nhị phân Màu len ID khối (Java)
0 0000 Trắng minecraft:white_wool
1 0001 Xám Nhạt minecraft:light_gray_wool
2 0010 Xám minecraft:gray_wool
3 0011 Đen minecraft:black_wool
4 0100 Nâu minecraft:brown_wool
5 0101 Đỏ minecraft:red_wool
6 0110 Cam minecraft:orange_wool
7 0111 Vàng minecraft:yellow_wool
8 1000 Xanh Lá Mạ minecraft:lime_wool
9 1001 Xanh Lá Cây minecraft:green_wool
A 1010 Xanh Ngọc minecraft:cyan_wool
B 1011 Xanh Da Trời minecraft:light_blue_wool
C 1100 Xanh Dương minecraft:blue_wool
D 1101 Tím minecraft:purple_wool
E 1110 Hồng Cánh Sen minecraft:magenta_wool
F 1111 Hồng minecraft:pink_wool

Ví dụ, nếu bạn muốn viết chuỗi nhị phân 1111 0000 1010 0001, nó sẽ được biểu diễn bằng các khối len như sau:

  • Len Hồng (1111)
  • Len Trắng (0000)
  • Len Xanh Ngọc (1010)
  • Len Xám Nhạt (0001)

May mắn thay, mặc dù có rất nhiều công đoạn đặt khối thủ công đối với người làm bằng tay, việc mã hóa dữ liệu theo cách này không quá khó khăn nói chung. Tôi đã xây dựng một công cụ mã hóa sẽ tạo ra một hình ảnh để bạn tham khảo khi xây dựng định dạng dữ liệu của mình.

Quá Trình Mã Hóa File Thành Các Khối Len

Quá trình mã hóa dữ liệu thành các khối len trong Minecraft được thực hiện thông qua một công cụ tự động, giúp giảm bớt đáng kể công sức đặt khối thủ công.

Tạo File mcfunction Tự Động Đặt Khối

Mã hóa dữ liệu khá dễ dàng và không mất nhiều thời gian trong tổng số thời gian dài mà tôi đã dành cho việc lưu trữ file trong Minecraft. Một gợi ý về điều gì đã tiêu tốn quá nhiều thời gian có thể được thấy trong hình ảnh trên, cụ thể là số lượng bộ giải mã tôi đã thử triển khai. Chúng ta sẽ nói về điều đó sau một chút. Tuy nhiên, bạn có thể thấy bộ mã hóa đã chạy trong terminal ở cuối màn hình, một hình ảnh đã được tạo và một file “mcfunction” đã được tạo ra. File “mcfunction” về cơ bản là một script có thể chạy tất cả các lệnh đã nhập vào nó, vì vậy chúng ta có thể ngay lập tức đặt tất cả các khối mà không cần phải làm thủ công. Hình ảnh được tạo ra để tham khảo để bạn có thể tự đặt chúng, nếu bạn muốn.

Để gọi bộ mã hóa của chúng tôi, chúng ta chạy lệnh sau, yêu cầu cài đặt module Pillow:

python3 encoder.py hello.txt --cols 12 --y -60

Lệnh này yêu cầu bộ mã hóa chỉ sử dụng 12 cột mỗi lần (mặc định là 64) và sử dụng mức Y là -60, vì tôi đang thử nghiệm trong một thế giới siêu phẳng. Đây là những gì trông giống như trên hình ảnh khi được tạo trong game:

Minecraft File EncodingMinecraft File Encoding

Tôi đã thêm các khối xung quanh các cạnh cho mục đích thử nghiệm khi giải mã, vì vậy, thực tế, những gì bạn sẽ nhận được chỉ là ma trận các khối len. Tùy thuộc vào giá trị “cols” của bạn, nó có thể rộng hơn rất nhiều. Chúng ta đã hoàn thành việc mã hóa, bây giờ là lúc thử giải mã file của chúng ta.

Thử Thách Và Giải Pháp Khi Giải Mã Dữ Liệu Từ Thế Giới Minecraft

Việc giải mã dữ liệu từ thế giới Minecraft hóa ra lại phức tạp hơn nhiều so với quá trình mã hóa, đòi hỏi những giải pháp kỹ thuật khác nhau để đạt được độ chính xác mong muốn.

Những Khó Khó Khăn Ban Đầu: Thất Bại Với OCR và Quyết Định Sử Dụng Amulet

Đây là nơi tôi gặp phải những vấn đề lớn, và giải pháp cuối cùng mà tôi chọn, đáng buồn thay, không phải là điều tôi muốn ban đầu. Tôi đã định sử dụng công nghệ nhận dạng hình ảnh (OCR) để xác định các khối được đặt trong ảnh chụp màn hình. Đây là lý do tại sao tôi đặt những khối khác nhau xung quanh các cạnh để cố gắng xác định cạnh của ma trận len. Nó có vẻ hoạt động một chút khi tôi sử dụng thư viện sklearn, nhưng sự thay đổi góc nhìn và chiều dài khối hơi khác nhau do khoảng cách của chúng đến ma trận len đã làm cho kết quả không nhất quán. Đôi khi nó giải mã được một phần, nhưng những lúc khác lại không thể giải mã được gì cả. Tôi đã dành quá nhiều thời gian để thử các phương pháp khác nhau sử dụng hình ảnh, nhưng cuối cùng tôi đã sử dụng Amulet, một thư viện Python có thể đọc trực tiếp từ file thế giới của game.

Giải Mã Thành Công Với Thư Viện Amulet Python

Giải pháp với Amulet đã hoạt động hoàn hảo, mặc dù nó có một vài nhược điểm. Nó không đơn giản như việc chỉ chụp ảnh màn hình những gì đang ở trước mặt bạn và chuyển đổi nó trở lại thành một file. Nó đòi hỏi nhiều công đoạn tái tạo thủ công hơn nếu bạn muốn chia sẻ một file với một người bạn qua Minecraft bằng cách sử dụng máy chủ, chẳng hạn. Về cơ bản, bạn sẽ cần chụp ảnh màn hình, xây dựng lại nó cục bộ trong thế giới của riêng bạn, và sau đó tái tạo nó bằng bộ giải mã. Rõ ràng, không ai thực sự thích làm điều đó, nhưng tôi cũng dám chắc rằng không ai thực sự vui mừng khi nghĩ đến việc chia sẻ file qua Minecraft, ngay cả khi có thể chụp ảnh ma trận len để lấy file. Tôi chỉ muốn làm điều đó “đúng cách”, theo một cách dễ tiếp cận và không yêu cầu quyền truy cập vào các file thế giới thực tế.

Như bạn có thể thấy dưới đây, việc đọc từ file thế giới hoạt động hoàn hảo, đúng như mong đợi với bản chất xác định của việc có thể đọc từng khối riêng lẻ.

minecraft-decoder-runningminecraft-decoder-running

Các Tham Số Cần Thiết Để Giải Mã Dữ Liệu

Có một vài hạn chế khi đọc các file thế giới; bạn sẽ cần xác định tọa độ X, Y và Z của góc trên cùng bên trái của ma trận len, chọn xem bạn di chuyển điển hình dọc theo trục X và Z (tức là tăng X và Z khi bạn di chuyển ngang và xuống), và xác định chiều cao và chiều rộng của ma trận. Đây là một quá trình khá thủ công, nhưng nó hoạt động. Khi bạn chạy chương trình lần đầu tiên, bạn sẽ được yêu cầu nhập các chi tiết này:

  • Tọa độ X góc trên bên trái
  • Tọa độ Y góc trên bên trái
  • Tọa độ Z góc trên bên trái
  • Kích thước thế giới [overworld/nether/end] (mặc định = overworld)
  • Chiều rộng (số cột)
  • Chiều cao (số hàng)
  • Bước cột dX dZ [1 0]
  • Bước hàng dX dZ [0 1]
  • Phần đệm (số khối len trắng cuối cùng cần bỏ qua, 0 nếu không có)

Bạn cũng cần chạy nó bằng cách định nghĩa cờ –world, vì vậy bạn chạy script như sau:

python3 .decode_from_world.py --world '.New World'

Nếu chương trình gặp phải một khối không mong đợi, nó sẽ báo lỗi, hiển thị khối mà nó đã gặp để bạn có thể có một ý tưởng sơ bộ về những gì bạn cần điều chỉnh. Ngoài ra, bạn sẽ cần đổi tên “decoded.bin” để khớp với định dạng file mong muốn. Như đã đề cập trước đó, kiểu file chỉ là một chỉ báo bên ngoài cho các ứng dụng muốn tương tác với file, chứ không hơn. Dữ liệu vẫn giữ nguyên bất kể kiểu file là gì. Đây cũng là lý do tại sao “container”, khi nói đến các định dạng video, lại rất quan trọng, vì chúng thực sự định nghĩa cấu trúc dữ liệu, nén và nhiều hơn nữa.

Minecraft decoded.bin in hexeditorMinecraft decoded.bin in hexeditor

Kiểm Chứng Tính Chính Xác Của Dữ Liệu Đã Giải Mã

Khi chúng ta chạy bộ giải mã, chúng ta có thể thấy đầu ra của mình, được tính toán từ việc ánh xạ mỗi khối len sang một giá trị thập lục phân và sau đó ghi vào một file có tên decoded.bin:

Hi there, this is a test file to show encoding a file in Minecraft!

Trong khi chúng ta biết nó đã giải mã, vì vậy nó đã hoạt động, chúng ta thậm chí có thể xem các giá trị hex và so sánh chúng với bản đồ len của chúng ta. File của chúng ta bắt đầu bằng “48 69 20 74” trong hệ thập lục phân, tương ứng với:

  • Len Nâu
  • Len Xanh Lá Mạ
  • Len Cam
  • Len Xanh Lá Cây
  • Len Xám
  • Len Trắng
  • Len Vàng
  • Len Nâu

Điều này khớp với các khối mà chúng ta đã đặt trong game, chứng tỏ tính chính xác của phương pháp giải mã.

Dữ Liệu Có Thể Được Biểu Diễn Bằng Bất Cứ Thứ Gì – Quan Trọng Là Cách Truy Xuất

Như chúng ta đã thấy trước đây, các file có thể được biểu diễn bằng bất cứ thứ gì. Nếu bạn có thể định nghĩa cấu trúc riêng để đọc các file đó, bạn có thể lưu trữ bất cứ thứ gì ở bất kỳ định dạng nào. Một chuỗi đèn LED có thể đại diện cho các số 0 và 1 dựa trên trạng thái của chúng, hoặc một chai nước có thể đại diện cho hai bit dữ liệu dựa trên việc nó rỗng, một phần tư đầy, nửa đầy hoặc hoàn toàn đầy. Miễn là bạn biết nó có nghĩa là gì, bạn có thể nói cho người khác biết và họ có thể diễn giải dữ liệu được biểu diễn theo cùng một cách mà bạn có thể.

Dự án này không có ý định được sử dụng ở dạng hiện tại của nó. Trên thực tế, tôi dám nói rằng bạn không bao giờ nên sử dụng một trò chơi để gửi file cho người khác, đặc biệt không phải theo một cách tẻ nhạt như vậy. Thay vào đó, dự án này nhằm mục đích minh họa cách các file có thể được lưu trữ một cách độc đáo. Nếu bạn quan tâm đến việc xem mã tôi đã viết cho dự án này, nó có sẵn trên GitHub. Hãy thử nghiệm và khám phá những khả năng vô tận của dữ liệu!


Tìm hiểu thêm:

Nếu bạn muốn khám phá sâu hơn về các phương pháp lưu trữ dữ liệu độc đáo, hãy tìm đọc bài viết:
I used YouTube as unlimited storage by storing files as videos

Related posts

6 Cài Đặt BIOS Quan Trọng Giúp Tối Ưu Hiệu Năng PC Của Bạn

Administrator

So Sánh 7-Zip và WinRAR: Ai Là Vua Nén & Giải Nén File Trên Windows?

Administrator

Tự động hóa trải nghiệm chơi game với Home Assistant: Thiết lập ‘Chế độ Game’ thông minh

Administrator