Tôi đang sử dụng Axios để yêu cầu hình ảnh từ URL như thế này:
const response = await axios.get['//asite.dom/image/url', { responseType: 'arrayBuffer' }];
Tôi không cần và không muốn lưu tệp cục bộ. Tôi chỉ cần dữ liệu nhị phân đơn giản để kiểm tra kích thước hình ảnh.
Vì vậy, tôi không muốn làm điều này
const bufferImage = Buffer.from[response.data, 'binary'];
Bởi vì đó là một bộ đệm không phải là dữ liệu nhị phân.
Tôi đã cố gắng truy cập
response.data
Trực tiếp, nhưng đó cũng không phải là dữ liệu nhị phân của hình ảnh.
Ai có thể giúp tôi với điều này?
hỏi ngày 26 tháng 3 năm 2020 lúc 11:42Mar 26, 2020 at 11:42
Chỉ cần kiểm tra điều này và nó hoạt động:
const response = await axios.get[
'//example.com/image.png', { responseType: 'arraybuffer' }
];
const bin = response.data.toString['binary'];
console.log[bin];
Điều quan trọng dường như là bạn đã tận dụng b
trong
const bufferImage = Buffer.from[response.data, 'binary'];
0. Ngoài ra, const bufferImage = Buffer.from[response.data, 'binary'];
1 đã là một bộ đệm, vì vậy bạn chỉ có thể chuyển đổi trực tiếp nó thành một chuỗi.Đã trả lời ngày 26 tháng 3 năm 2020 lúc 11:56Mar 26, 2020 at 11:56
Aiyanaiyanaiyan
3963 Huy hiệu bạc11 Huy hiệu đồng3 silver badges11 bronze badges
2
Đối tượng đệm
Trong một thời gian dài, JavaScript đã thiếu hỗ trợ để xử lý các mảng dữ liệu nhị phân. Điều đó đã thay đổi với Ecmascript 2015, khi các mảng được gõ được giới thiệu và cho phép xử lý tốt hơn các trường hợp đó.
Tất cả các loại này xuất phát từ một lớp typedarray trừu tượng, mỗi loại chuyên về kích thước từ số nguyên cụ thể và ký kết, và một số cung cấp hỗ trợ dấu phẩy động. Float64array, ví dụ, đại diện cho một mảng gồm các số nổi 64 bit; Int16Array đại diện cho một loạt các số nguyên có chữ ký 16 bit.
Trong tất cả các mảng được đánh máy, hữu ích nhất có lẽ là Uint8array. Nó cho phép xử lý dữ liệu nhị phân như tệp hình ảnh, giao thức mạng và phát video theo cách tương tự như cách thực hiện trong các ngôn ngữ lập trình khác.
Trong thế giới Node.js, có một lớp khác, Buffer, đi xuống từ Uint8array. Nó bổ sung một số phương thức tiện ích như Concat [], allocunSafe [] và so sánh [] và các phương thức để đọc và viết các loại số khác nhau, bắt chước những gì được cung cấp bởi lớp Dataview [ví dụ: readuint16be, writedoublele và swap32].
Mã hóa văn bản
Chủ đề mã hóa các ký tự văn bản sử dụng máy tính rất rộng lớn và phức tạp và tôi sẽ không đi sâu vào nó trong bài viết ngắn này.
Về mặt khái niệm, văn bản bao gồm các ký tự: các phần nhỏ nhất của nội dung có ý nghĩa - thường là các chữ cái, nhưng tùy thuộc vào ngôn ngữ có thể có các biểu tượng rất khác nhau. Sau đó, mỗi ký tự được gán một điểm mã: một số xác định nó trong mối quan hệ một-một.
Cuối cùng, mỗi điểm mã có thể được biểu diễn bằng một chuỗi các bit theo một mã hóa. Mã hóa là một bảng ánh xạ từng mã chỉ vào chuỗi bit tương ứng của nó.
Nó có thể trông giống như một bản đồ đơn giản, nhưng một số mã hóa đã được tạo ra trong những thập kỷ qua để phù hợp với nhiều kiến trúc máy tính và các bộ ký tự khác nhau. & NBSP;
Mã hóa phổ biến nhất là ASCII.
Nó bao gồm các ký tự Latin cơ bản [A-Z, chữ hoa và chữ thường], chữ số và nhiều ký hiệu dấu chấm câu, bên cạnh một số ký tự điều khiển. ASCII là mã hóa 7 bit, nhưng máy tính lưu trữ dữ liệu trong các khối 8 bit được gọi là byte, vì vậy nhiều mã hóa 8 bit đã được tạo, mở rộng 128 ký tự ASCII đầu tiên với 128 ký tự cụ thể ngôn ngữ khác.
Một mã hóa rất phổ biến là ISO-8859-1, còn được biết đến bởi một số tên khác như "Latin1", "IBM819", "CP819" và thậm chí "WE8ISO8859P1". ISO-8859-1 thêm một số biểu tượng bổ sung cho ASCII và nhiều chữ cái có dấu như Á, ú, è và õ.
Những mã hóa cụ thể về ngôn ngữ hoạt động hợp lý cho một số tình huống nhưng thất bại thảm hại trong bối cảnh đa ngôn ngữ.
Mất thông tin và tham nhũng dữ liệu là phổ biến vì các chương trình đã cố gắng thao tác văn bản bằng cách sử dụng mã hóa không chính xác cho một tệp.
Ngay cả hiển thị nội dung tệp là một mớ hỗn độn, bởi vì các tệp văn bản không bao gồm tên của mã hóa được sử dụng để mã hóa nội dung của nó.
Cố gắng sửa chữa điều đó, tiêu chuẩn Unicode đã được bắt đầu vào những năm 1980. Mục tiêu của họ là ánh xạ mọi nhân vật hiện đang được sử dụng trong mọi ngôn ngữ của con người [và một số kịch bản lịch sử] đến một điểm mã duy nhất.
Tiêu chuẩn Unicode cũng xác định một số mã hóa chung có thể mã hóa mọi điểm mã Unicode.
Các mã hóa phổ biến nhất cho Unicode là UTF-16, UCS-2, UTF-32 và UTF-8. Ngoại trừ UCS-2, sử dụng chiều rộng cố định cho tất cả các điểm mã [do đó ngăn nó biểu thị tất cả các ký tự Unicode], tất cả các mã hóa này đều sử dụng một số bit biến để mã hóa từng điểm mã.
Trên web, mã hóa Unicode được sử dụng rộng rãi nhất là UTF-8, bởi vì nó hiệu quả một cách hợp lý cho nhiều mục đích sử dụng. Nó sử dụng 1 byte cho các ký tự ASCII và 2 byte cho hầu hết các kịch bản châu Âu và Trung Đông - nhưng nó kém hiệu quả hơn đối với các tập lệnh châu Á, đòi hỏi 3 byte trở lên. Ví dụ, người Pháp nói rằng "Il Vaut Mieux Prévenir Que Guérir" tương đương với chuỗi byte sau đây khi nó được mã hóa bằng UTF-8 [các byte được hiển thị bằng thập lục phân]:
Tôi | l | v | một | u | t | m | tôi | e | u | t | m | tôi | e | ||||
49 | x | 20 | 76 | 61 | 75 | 74 | 20 | P | 69 | 65 | 75 | 78 | 20 | 70 | 72 | r | é |
v | e | x | tôi | tôi | e | u | e | x | u | e | tôi | tôi | tôi | |||
76 | 65 | e | 69 | 72 | 20 | 71 | 75 | 65 | 20 | 67 | 75 | r | é | 72 | 69 | 72 |
6c
6d
const b = Buffer.from[[101, 120, 97, 109, 112, 108, 101]];
console.log[b.toString[]]; // example
C3
const b = Buffer.from[[101, 120, 97, 109, 112, 108, 101]];
console.log[b.toString['latin1']]; // example
A9
N | Q. |
g | |
6e | |
Chuyển đổi bộ đệm thành chuỗi node.js | |
Đã nói tất cả những điều đó, nội dung của bộ đệm có thể được chuyển đổi nhanh chóng thành một chuỗi bằng phương thức toString []: | |
Hãy nhớ rằng bài phát biểu về mã hóa văn bản? Chà, lớp bộ đệm sử dụng UTF-8 theo mặc định khi chuyển đổi sang/từ các chuỗi, nhưng bạn cũng có thể chọn một bộ khác từ một bộ mã hóa nhỏ được hỗ trợ: | Hầu hết thời gian, UTF-8 là lựa chọn tốt nhất cho cả đọc và viết. Nhưng để hoàn thiện, đây là danh sách đầy đủ các mã hóa được hỗ trợ trong Node.js [tính đến tháng 9/2021] - Tên không nhạy cảm với trường hợp: |
Mã hóa | Bí danh được chấp nhận |
ascii | cơ sở64 |
cơ sở64url | Hex |
Latin1
nhị phân
const s = Buffer.from['example', 'utf8'];
console.log[s]; //
UCS2
const b = Buffer.alloc[10];
console.log[b];
//
b.write['example', 'utf8'];
console.log[b];
//
UCS-2
const b = Buffer.alloc[10];
b.write['test', 4, 'utf8'];
console.log[b];
//
UTF8
UTF-8
UTF16LE
- UTF-16LE
- Chuyển đổi chuỗi node.js thành bộ đệm
- Cũng có thể chuyển đổi dữ liệu theo hướng ngược lại. Bắt đầu từ một chuỗi, bạn có thể tạo một bộ đệm mới từ nó [nếu mã hóa không được chỉ định, Node.js giả định UTF-8]:
- Nếu bạn cần viết văn bản vào một đối tượng bộ đệm hiện có, bạn có thể sử dụng phương thức ghi [] của nó: