Máy Tính

Khám phá cách lưu trữ dữ liệu “siêu độc đáo” trong thế giới Minecraft

Giao diện trình chỉnh sửa Hex hiển thị siêu dữ liệu của file ZIP được giải mã, minh họa cách dữ liệu được lưu trữ dạng nhị phân.

File – một khái niệm quen thuộc trong thế giới công nghệ, thực chất chỉ là một tập hợp dữ liệu được sắp xếp tuần tự dưới dạng một mảng byte một chiều. Các hệ điều hành hiện đại thường dựa vào phần mở rộng file (ví dụ: .jpg, .zip) để xác định loại file, từ đó áp dụng các quy tắc nhất định để giải thích dữ liệu bên trong một cách có ý nghĩa. Tuy nhiên, bản chất cốt lõi của một “file” là một tập hợp dữ liệu không hề có gì quá đặc biệt. Bạn không cần một định dạng file cụ thể cho bất kỳ loại dữ liệu nào. Thậm chí, bạn có thể lưu một file JPG dưới dạng .zip và nếu bạn buộc trình chỉnh sửa ảnh mở nó, khả năng cao là nó vẫn sẽ hoạt động.

Với hiểu biết sâu sắc này, rõ ràng dữ liệu không chỉ có thể được biểu diễn theo một cách duy nhất. Chúng ta đã từng minh họa cách các file có thể được lưu trữ bên trong Pokémon Emerald một cách đầy sáng tạo. Tiếp nối ý tưởng đó, chúng tôi quyết định nâng tầm thử thách: Liệu có thể lưu trữ file trong Minecraft hay không? Với một thế giới gần như vô hạn, về mặt lý thuyết, bạn có thể lưu trữ bất kỳ file nào mình muốn bên trong trò chơi, miễn là bạn biết cách giải mã nó sau này. Đó chính xác là những gì chúng tôi đã thực hiện, và mặc dù quá trình này khá gian nan, đâ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 chúng tôi khám phá hành trình biến những khối vuông Minecraft thành nơi lưu trữ dữ liệu độc đáo, và bạn có thể tìm thấy liên kết đến mã nguồn GitHub ở cuối bài viết để tự mình trải nghiệm dự án thú vị này!

Chuẩn bị nền tảng: Hiểu về lưu trữ dữ liệu cơ bản

Biểu diễn dữ liệu bằng màu sắc trong Minecraft

Đầu tiên và quan trọng nhất, chúng tôi cần tìm một phương pháp dễ dàng để biểu diễn dữ liệu trong Minecraft mà có thể thu được một cách hợp lệ trong trò chơi và vẫn có khả năng lưu trữ 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 ban đầu bao gồm việc lột gỗ và sử dụng hướng của chúng, hoặc sử dụng các khung vật phẩm với các vật phẩm bên trong. Tuy nhiên, chúng tôi nhận ra rằng Minecraft có 16 màu len khác nhau, đây là một con số hoàn hảo để mã hóa dữ liệu. Len không chỉ dễ kiếm mà việc có 16 màu cho phép chúng ta lưu trữ bốn bit dữ liệu (một “nibble”) trong mỗi khối len, đồng nghĩa với việc chúng ta có thể biểu diễn một byte dữ liệu đầy đủ chỉ với hai khối.

Về bản chất, một file là một chuỗi các byte. Khi được chia nhỏ, chuỗi này được phân tách thành các đoạn nhỏ hơn, dễ quản lý hơn. Việc phân chia này được thực hiện sao cho mỗi đoạn là một tập hợp con chính xác, liên tục của chuỗi byte gốc của file. Quá trình này là không mất dữ liệu, có nghĩa là nó không làm thay đổi nội dung của các byte. Miễn là các đoạn này được ghép lại theo đúng thứ tự, file gốc có thể được tái tạo hoàn hảo. Với kiến thức này, chúng 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, điều này giúp chúng tôi đọc và ghi dữ liệu. Đối với các file nhỏ, việc xây dựng các cấu trúc này bằng tay khá khả thi; như chúng tôi sẽ minh họa 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 phiên bản Java của Minecraft.

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

Ký tự 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ạ (Lime) minecraft:lime_wool
9 1001 Xanh lá (Green) minecraft:green_wool
A 1010 Xanh ngọc (Cyan) minecraft:cyan_wool
B 1011 Xanh dương nhạt 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 (Magenta) minecraft:magenta_wool
F 1111 Hồng minecraft:pink_wool

Ví dụ, nếu bạn muốn mã hóa chuỗi nhị phân 1111 0000 1010 0001, nó sẽ tương ứng với:

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

Rất may, mặc dù có khá nhiều công việc đặt khối thủ công nếu ai đó làm bằng tay, nhưng nhìn chung việc mã hóa dữ liệu theo cách này không quá khó khăn. Chúng tôi cũng đã xây dựng một bộ mã hóa sẽ tạo ra một hình ảnh tham chiếu để bạn có thể tham khảo khi xây dựng định dạng dữ liệu của mình.

Giao diện trình chỉnh sửa Hex hiển thị siêu dữ liệu của file ZIP được giải mã, minh họa cách dữ liệu được lưu trữ dạng nhị phân.Giao diện trình chỉnh sửa Hex hiển thị siêu dữ liệu của file ZIP được giải mã, minh họa cách dữ liệu được lưu trữ dạng nhị phân.

Quy trình mã hóa dữ liệu thành các khối Minecraft

Công cụ và lệnh mã hóa

Quá trình mã hóa dữ liệu tương đối dễ dàng và không tốn nhiều thời gian so với tổng thời gian mà chúng tôi đã dành để lưu trữ file trong Minecraft. Một gợi ý về phần nào tốn nhiều thời gian hơn có thể thấy trong hình ảnh bên trên, cụ thể là số lượng bộ giải mã mà chúng tôi đã cố gắng triển khai. Chúng ta sẽ tìm hiểu đ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ũng được sinh ra. Một 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 đó, giúp chúng ta có thể đặt tất cả các khối ngay lập tức mà không cần phải làm thủ công. Hình ảnh được tạo ra chỉ để tham khảo, nếu bạn muốn đặt chúng bằng tay.

Để 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ột lúc (mặc định là 64), và sử dụng mức Y là -60, vì chúng tôi đang thử nghiệm trong một thế giới siêu phẳng. Đây là những gì kết quả trông giống trong trò chơi:

Giao diện dòng lệnh hiển thị quá trình chạy công cụ mã hóa file Minecraft, tạo ra các khối len màu từ dữ liệu file gốc.Giao diện dòng lệnh hiển thị quá trình chạy công cụ mã hóa file Minecraft, tạo ra các khối len màu từ dữ liệu file gốc.

Hình ảnh trong game Minecraft hiển thị ma trận các khối len màu được sắp xếp, đại diện cho dữ liệu đã được mã hóa từ một file.Hình ảnh trong game Minecraft hiển thị ma trận các khối len màu được sắp xếp, đại diện cho dữ liệu đã được mã hóa từ một file.

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

Thử thách giải mã: Phục hồi file từ thế giới Minecraft

Những nỗ lực ban đầu và giải pháp

Đây là lúc chúng tôi gặp phải những vấn đề lớn, và giải pháp cuối cùng mà chúng tôi lựa chọn, đáng tiếc, không phải là điều chúng tôi mong muốn ban đầu. Chúng tôi đã lên kế hoạch 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 chúng tôi đặt các khối khác nhau quanh rìa để cố gắng xác định cạnh của ma trận len. Phương pháp này có vẻ hoạt động sau khi sử dụng sklearn, nhưng sự thay đổi phối cảnh 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 khiến kết quả không nhất quán. Đôi khi nó giải mã được một phần, nhưng đôi khi lại không thể giải mã được chút nào. Chúng tôi đã dành quá nhiều thời gian cho nhiều cách tiếp cận khác nhau bằng cách sử dụng hình ảnh, nhưng cuối cùng, chúng tôi đã quyết định sử dụng Amulet, một thư viện Python có thể đọc trực tiếp từ file thế giới Minecraft.

Giải pháp này 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 màn hình những gì trước mặt bạn và chuyển đổi lại thành file, và nó yêu cầu 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 bạn bè qua Minecraft bằng một server, 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 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 chú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 màn hình ma trận len để lấy file. Chúng tôi chỉ muốn thực hiện nó một cách “đúng đắn”, dễ tiếp cận, và không yêu cầu truy cập vào 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 tính chất xác định của việc có thể đọc từng khối riêng lẻ.

Giao diện hiển thị lỗi khi cố gắng giải mã dữ liệu từ ảnh chụp màn hình Minecraft bằng công nghệ OCR, minh họa thách thức trong việc đọc dữ liệu trực quan.Giao diện hiển thị lỗi khi cố gắng giải mã dữ liệu từ ảnh chụp màn hình Minecraft bằng công nghệ OCR, minh họa thách thức trong việc đọc dữ liệu trực quan.

Các bước giải mã thủ công với Amulet

Có một vài hạn chế khi đọc file thế giới; bạn sẽ cần xác định tọa độ X và Y của góc trên bên trái của ma trận len, chọn xem bạn di chuyển 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 hiệu quả. Khi bạn chạy chương trình lần đầu, bạn sẽ được yêu cầu cung cấ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 (cột)
  • Chiều cao (hàng)
  • Bước cột dX dZ [1 0]
  • Bước hàng dX dZ [0 1]
  • Padding (số khối len trắng cuối cùng để 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 muốn, nó sẽ báo lỗi, hiển thị khối đó để bạn có thể nắm được những gì cần điều chỉnh. Ngoài ra, bạn sẽ cần đổi tên file “decoded.bin” để khớp với định dạng file mong muốn. Như đã đề cập trước đó, một loại 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, và không hơn. Dữ liệu vẫn giữ nguyên bất kể loại file là gì. Đây cũng là lý do tại sao các “container” khi nói đến đị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.

Giao diện dòng lệnh hiển thị quá trình chạy công cụ giải mã file Minecraft từ dữ liệu thế giới, thành công chuyển đổi các khối len trở lại định dạng file gốc.Giao diện dòng lệnh hiển thị quá trình chạy công cụ giải mã file Minecraft từ dữ liệu thế giới, thành công chuyển đổi các khối len trở lại định dạng file gốc.

Trình chỉnh sửa Hex hiển thị nội dung của file "decoded.bin" sau khi giải mã từ Minecraft, cho phép so sánh dữ liệu nhị phân với bảng ánh xạ màu len.Trình chỉnh sửa Hex hiển thị nội dung của file "decoded.bin" sau khi giải mã từ Minecraft, cho phép so sánh dữ liệu nhị phân với bảng ánh xạ màu len.

Sau khi chạy bộ giải mã, chúng ta có thể thấy kết quả đầu ra của mình, được tính toán bằng cách ánh xạ từng khối len thành 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ó đã được giải mã thành công, chúng ta thậm chí có thể thấy các giá trị thập lục phân 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 (48)
  • Len Xanh lá mạ (69)
  • Len Xám (20)
  • Len Vàng (74)

Điều này khớp chính xác với các khối mà chúng ta đã đặt trong trò chơi.

Kết luận: Dữ liệu là vô hình, cách biểu diễn là vô hạn

Như chúng ta đã thấy trước đây, các file có thể được biểu diễn bằng bất kỳ thứ gì. Nếu bạn có thể định nghĩa cấu trúc riêng để đọc các file đó, bạn hoàn toàn có thể lưu trữ bất cứ thứ gì dưới 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 tùy thuộc vào việc nó rỗng, đầy một phần tư, đầy một nửa hay đầy hoàn toàn. Miễn là bạn biết ý nghĩa của nó, bạn có thể giải thích cho người khác, và họ có thể hiểu dữ liệu được biểu diễn theo cùng một cách mà bạn làm.

Dự án này không nhằm mục đích sử dụng trong thực tế dưới hình thức hiện tại. Thậm chí, chúng tôi có thể khẳng định rằng bạn không 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 đó, nó 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 và sáng tạo. Nếu bạn quan tâm đến việc tìm hiểu mã nguồn mà chúng tôi đã viết cho dự án này, bạn có thể truy cập trang GitHub của chúng tôi.

Hình ảnh minh họa ý tưởng biến đổi dữ liệu thành video YouTube, biểu tượng YouTube và file ZIP hướng đến file MP4 trên máy Mac, gợi ý về các phương pháp lưu trữ dữ liệu độc đáo.Hình ảnh minh họa ý tưởng biến đổi dữ liệu thành video YouTube, biểu tượng YouTube và file ZIP hướng đến file MP4 trên máy Mac, gợi ý về các phương pháp lưu trữ dữ liệu độc đáo.

Chúng tôi đã biến YouTube thành kho lưu trữ đám mây không giới hạn bằng cách lưu file dưới dạng video

Bạn hoàn toàn có thể sử dụng YouTube làm kho lưu trữ đám mây không giới hạn về mặt kỹ thuật, mặc dù chúng tôi không thực sự khuyến khích điều đó.

Related posts

Omni Tools: Trợ Thủ PDF Miễn Phí Đa Năng Thay Thế Adobe Acrobat Hiệu Quả

Administrator

Creality Ender-3: Lựa chọn máy in 3D hàng đầu cho người mới bắt đầu vào năm 2025?

Administrator

UniGetUI: Trình Quản Lý Ứng Dụng Windows Toàn Diện, Thay Thế Hiệu Quả Dòng Lệnh

Administrator