Giao diện terminal hiển thị quá trình chạy công cụ mã hóa file vào Minecraft
Máy Tính

Khám Phá Cách Lưu Trữ File Trong Minecraft Bằng Khối Len Màu

File dữ liệu là một khái niệm thú vị; về cơ bản, chúng chỉ là tập hợp các dữ liệu được chứa trong một “vật chứa” duy nhất, và dữ liệu này được tổ chức thành một mảng byte một chiều. Nhiều hệ điều hành hiện đại sử dụng phần mở rộng của file để xác định “loại file” đó là gì, và điều này, đến lượt nó, chỉ định các quy tắc về cách dữ liệu được tổ chức để có thể diễn giải một cách có ý nghĩa. Tuy nhiên, khi một “file” được định nghĩa là tập hợp dữ liệu, nó không có gì 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 file .zip nếu muốn, và nếu bạn buộc trình chỉnh sửa ảnh của mình mở nó, rất có thể nó vẫn sẽ… mở ra bình thường.

Với kiến thức đó, dữ liệu không phải là thứ mà bạn không thể biểu diễn dưới các dạng khác. Chúng ta đã từng chứng minh cách file có thể được lưu trữ trong các tựa game khác, và chúng tôi quyết định tiến thêm một bước nữa. Sẽ ra sao nếu chúng ta có thể lưu file bên trong Minecraft? Với một thế giới vô tận, về lý thuyết, bạn có thể lưu trữ bất kỳ file nào bạn muốn trong trò chơi, miễn là bạn biết cách diễn giải nó sau này. Đó chính xác là những gì chúng tôi đã thực hiện, và mặc dù tốn rất nhiều 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 trữ và tham chiếu.

Bạn có thể tham khảo liên kết GitHub ở cuối bài viết này để tự mình trải nghiệm!

Thế Giới Dữ Liệu Trong Minecraft: Nền Tảng Lý Thuyết

Hiểu Về Bản Chất Dữ Liệu Và File

Trước hết, chúng tôi muốn tìm một cách để dễ dàng biểu diễn dữ liệu trong Minecraft theo một phương pháp hợp lệ trong trò chơi, đồng thời vẫn có thể chứa 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 của chúng tôi 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 là sử dụng khung ảnh với các vật phẩm bên trong. Tuy nhiên, chúng tôi nhận ra rằng có 16 màu len trong game, điều này là hoàn hảo. Len không chỉ dễ kiếm, mà việc có 16 màu khả dụng có nghĩa là chúng ta có thể lưu trữ bốn bit dữ liệu trong mỗi khối len, và điều đó cũng có nghĩa là chúng ta có một byte hoàn chỉnh sau mỗi hai khối.

Về bản chất, một file là một chuỗi các byte, và khi được chia nhỏ, chuỗi này sẽ được phân thành các phân đoạn nhỏ hơn, dễ quản lý hơn. Việc phân chia này được thực hiện theo cách mà mỗi phân đoạn là một tập con chính xác, liên tục của chuỗi byte gốc. Quá trình này về cơ bản là không mất mát, nghĩa là nó 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 lắp ráp lại đúng thứ tự, file gốc có thể được tái tạo hoàn hảo. Nắm vững kiến thức này, chúng tôi đã tạo một bảng ánh xạ các chữ số hex và chuỗi bốn bit với một màu len, mà chúng ta có thể sử dụng để đọ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 khá thực tế; như chúng tôi sẽ chứng minh sau, một file 67 byte 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.

Đây là bảng ánh xạ chúng 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 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 phấn 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ẽ tương ứng với:

  • Len Hồng
  • Len Trắng
  • Len Xanh ngọc
  • Len Xám nhạt

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

Quá Trình Mã Hóa File Vào Minecraft

Tạo File mcfunction – Tự Động Xây Dựng Cấu Trúc

Giao diện terminal hiển thị quá trình chạy công cụ mã hóa file vào MinecraftGiao diện terminal hiển thị quá trình chạy công cụ mã hóa file vào Minecraft

Mã hóa dữ liệu khá dễ dàng, và không tốn quá nhiều thời gian trong số lượng thời gian đáng lẽ ra quá dài mà chúng tôi đã dành để lưu trữ file trong Minecraft ngay từ đầu. Một gợi ý về điều gì đã tốn quá nhiều thời gian có thể được nhìn thấy trong hình ảnh trên, cụ thể là ở số lượng bộ giải mã (decoder) mà chúng tôi đã cố gắng triển khai. Chúng ta sẽ nói về điều đó sau. 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 tập lệnh có thể chạy tất cả các lệnh được nhập vào đó, vì vậy 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 thực hiện thủ công. Tuy nhiên, hình ảnh được tạo ra để tham khảo, giúp bạn có thể tự đặt các khối nếu 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 mô-đun 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 điều này trong một thế giới siêu phẳng. Đây là những gì kết quả trên trông giống như trong game:

Cấu trúc ma trận khối len màu được tạo tự động trong thế giới Minecraft sau khi mã hóa fileCấu trúc ma trận khối len màu được tạo tự động trong thế giới Minecraft sau khi mã hóa file

Chúng tôi đã thêm các khối xung quanh rìa để phục vụ mục đích thử nghiệm khi giải mã, vì vậy, thực tế, những gì bạn sẽ có đượ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: Giải Mã File Từ Minecraft

Thử Nghiệm OCR: Một Thất Bại Đầy Bài Học

Ảnh chụp màn hình thể hiện nỗ lực giải mã file từ Minecraft bằng OCR không thành côngẢnh chụp màn hình thể hiện nỗ lực giải mã file từ Minecraft bằng OCR không thành công

Đây là lúc chúng tôi gặp phải những vấn đề lớn, và giải pháp mà chúng tôi đã lựa chọn, thật đáng buồn, không phải là giải pháp ban đầu mà chúng tôi mong muốn. 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 một ảnh chụp màn hình, và đây là lý do tại sao chúng tôi đặt các khối khác nhau xung quanh rìa để cố gắng xác định cạnh của ma trận len. Nó tạm thời hoạt động sau khi chúng tôi sử dụng sklearn, nhưng sự thay đổi góc nhìn và chiều dài khối hơi khác nhau do điều này, với khoảng cách đến ma trận len, có nghĩa là nó không nhất quán. Đôi khi nó giải mã được một phần, nhưng đôi khi lại hoàn toàn không thể giải mã. 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 đã sử dụng Amulet, một thư viện Python có thể đọc trực tiếp từ file thế giới.

Phương 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ỉ cần chụp ảnh màn hình những gì trước mắt bạn và chuyển đổi nó trở lại thành một file, và 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 bạn bè qua Minecraft bằng một 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 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 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 để trích xuất file. Chúng 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 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 trích xuất từ file thế giới hoạt động hoàn hảo, như bạn mong đợi với tính chất xác định của việc có thể đọc các khối riêng lẻ.

Giao diện terminal hiển thị quá trình giải mã file thành công từ dữ liệu MinecraftGiao diện terminal hiển thị quá trình giải mã file thành công từ dữ liệu Minecraft

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 có di chuyển dọc theo trục X và Z một cách thông thường hay không (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. Đó 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 hỏi những chi tiết này:

  • X góc trên bên trái
  • Y góc trên bên trái
  • Z góc trên bên trái
  • Kích thước (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]
  • Phần đệm (các khối len trắng thừa để bỏ qua, 0 nếu không có)

Bạn cũng cần chạy nó bằng cách xác định cờ –world, vì vậy bạn chạy tập lệnh như sau:

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

Nếu nó gặp một khối không mong muốn, nó sẽ báo lỗi, hiển thị khối mà nó đã gặp để 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 “decoded.bin” để phù hợp với định dạng file mong muốn. Như đã đề cập trước đó, một 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 “các bộ chứa” (containers), 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 thế nữa.

File decoded.bin đã giải mã được hiển thị trong trình chỉnh sửa Hex, xác nhận tính chính xác của dữ liệuFile decoded.bin đã giải mã được hiển thị trong trình chỉnh sửa Hex, xác nhận tính chính xác của dữ liệu

Sau khi 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ạ từng khối len sang một giá trị hex 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!

Mặc dù chúng ta biết rằng nó đã được giải mã và hoạt động, chúng ta thậm chí có thể thấy 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 hex, 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 hoàn toàn khớp với các khối mà chúng ta đã đặt trong trò chơi.

Ý Nghĩa Sâu Sắc: Dữ Liệu Luôn Có Thể Được Biểu Diễn

Như chúng ta đã thấy trước đây, 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ì dưới bất kỳ định dạng nào. Một chuỗi đèn LED có thể đại diện cho 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, một phần tư đầy, nửa đầy hay hoàn toàn đầy. Miễn là bạn biết nó có nghĩa 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 nhằm mục đích sử dụng trong thực tế. Trên thực tế, chúng tôi sẽ đi xa hơn khi 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 là theo một cách tẻ nhạt như vậy. Thay vào đó, nó phục vụ mục đích minh họa cách các file có thể được lưu trữ độc đáo. Nếu bạn quan tâm đến việc xem xét mã mà chúng tôi đã viết cho dự án này, nó có sẵn trên GitHub.


Kết luận: Qua thử nghiệm độc đáo này, chúng ta đã chứng kiến cách dữ liệu có thể vượt ra khỏi những định dạng truyền thống và được biểu diễn trong một môi trường sáng tạo như Minecraft. Điều này không chỉ mở ra một góc nhìn mới về nguyên lý hoạt động của file và dữ liệu số, mà còn là minh chứng cho sự linh hoạt và vô hạn của công nghệ. Mặc dù không phải là một phương pháp lưu trữ thực tế, dự án này đã thành công trong việc giải mã bí mật về bản chất của dữ liệu, khẳng định rằng “file” chỉ là một cách diễn giải, và khả năng sáng tạo trong việc mã hóa và giải mã là không giới hạn.

Bạn có thấy hứng thú với các ứng dụng công nghệ độc đáo tương tự không? Hãy chia sẻ suy nghĩ của bạn trong phần bình luận bên dưới hoặc khám phá thêm các bài viết chuyên sâu khác trên congnghe360.net để không bỏ lỡ những phát hiện thú vị trong thế giới công nghệ!

Related posts

Ưu Đãi “Khủng”: SSD Samsung 9100 Pro 2TB Gen5 Giảm Giá Sâu Nhất Mọi Thời Đại!

Administrator

Thủ Thuật VLC Media Player: 5 Tính Năng Nâng Cao Bạn Chắc Chắn Chưa Từng Dùng

Administrator

8 Lý Do PowerToys Là Bộ Công Cụ “Phải Có” Để Nâng Tầm Năng Suất Windows

Administrator