国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Flutter Dart FFI Pointer<Uint8>類型如何轉(zhuǎn)成數(shù)組或String

這篇具有很好參考價(jià)值的文章主要介紹了Flutter Dart FFI Pointer<Uint8>類型如何轉(zhuǎn)成數(shù)組或String。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前言

繼上一次發(fā)布的 Flutter 直接調(diào)用so動(dòng)態(tài)庫,或調(diào)用C/C++源文件內(nèi)函數(shù) 內(nèi)容,最終我選擇了第二種方式,直接把整個(gè) Native C++ 的項(xiàng)目源代碼放進(jìn)了 Flutter 工程里編譯(放在iOS的目錄是因?yàn)樗恢С肿远x源碼路徑,Android是可以的)。這樣的好處是 Android 和 iOS 兩個(gè)平臺(tái)都不需要分別再去寫原生代碼調(diào)用 .so 文件,也不用關(guān)注動(dòng)態(tài)庫平臺(tái),而且改動(dòng)更方便。

編譯時(shí) Android 側(cè)會(huì)生成指定平臺(tái)的 .so 文件(Gradle里配置),iOS 側(cè)會(huì)生成指定平臺(tái)的 .a 文件(XCode里配置)

背景

Flutter 的項(xiàng)目里需要調(diào)用 C++ 進(jìn)行 APDU 指令的操作和傳輸,APDU 也就是一串 16 進(jìn)制編碼的字符串,也就是說 出入?yún)?/code> 需要傳輸 非短整型的值。實(shí)際傳輸需要根據(jù) C++ 端的定義去使用 Flutter 端的數(shù)據(jù)類型。



一、代碼部分

1. 分析底層定義函數(shù)的出入?yún)⒄页鲇成漕愋?/h4>

例如:C++ 定義了如下函數(shù)

extern "C" short apduProcess(uint8_t *apdu, uint8_t *response, uint8_t *len) {
	... apdu & response 業(yè)務(wù)處理
	return 0;
}

我們的關(guān)鍵點(diǎn)就是分析 C++ 定義的 出入?yún)?/strong> 的數(shù)據(jù)類型映射,參考 Dart - C 數(shù)據(jù)類型映射表 可以得出結(jié)論:

  1. 函數(shù)出參 用于返回函數(shù)執(zhí)行結(jié)果,使用的 short 類型,對應(yīng) Dart NativeType 的 Int16 類型;
  2. 函數(shù)入?yún)⒂腥齻€(gè) 用于數(shù)據(jù)的輸入和輸出,使用的 uint8_t 類型,對應(yīng) Dart NativeType 的 Uint8 類型,需要注意的是三個(gè)參數(shù)均為指針類型,由于 FFI 無法直接傳輸數(shù)組,因此需要需要自行開辟空間進(jìn)行存取,類型為 使用 Pointer<Uint8>

于是 Flutter 端得到了如下函數(shù):

typedef NativeFunc = 
	Int16 Function(Pointer<Uint8>, Pointer<Uint8>, Pointer<Uint8>);
	
typedef FFIFunc = 
	int Function(Pointer<Uint8>, Pointer<Uint8>, Pointer<Uint8>);

2. 調(diào)用函數(shù)

final func = _library.lookupFunction<NativeFunc, FFIFunc>('apduProcess');

// 初始化三個(gè)指針參數(shù)
final apdu = [0x00, 0xA4, 0x04, ...];
final inputApduPointer = calloc<Uint8>(apdu.length);
inputApduPointer.asTypedList(apdu.length).setAll(0, apdu);

final respApduPointer = calloc<Uint8>(100);
final respLenPointer = calloc<Uint8>(2);

// 調(diào)用函數(shù)
final result = func(inputApduPointer, respApduPointer, respLenPointer);

// 需要在指針釋放之前把response值取出來
String respApduStr = '';
for (var index = 0; index < respLenPointer.value; index++) {
  // 由于我傳入的內(nèi)容是 16 進(jìn)制字符串,所以需要 .toRadixString(16).padLeft(2, '0')
  respApduStr += respApduPointer.elementAt(index).value.toRadixString(16).padLeft(2, '0');
}

// 釋放申請的內(nèi)存空間
calloc.free(inputApduPointer);
calloc.free(respApduPointer);
calloc.free(respLenPointer);

3. 結(jié)論

遍歷 respApduPointer.elementAt(index).value 即可將正確的值取出

而這兩種方式拿到的值是不對的:

// 錯(cuò)誤方式 1
respApduPointer.cast<Utf8>().toDartString()

// 錯(cuò)誤方式 2
respApduPointer.asTypedList(xxx).map((e) => e.toRadixString(16).padLeft(2, '0')).join('')

二、分析一下我走的彎路

重點(diǎn)看 final respApduPointer = calloc<Uint8>(100); 這個(gè)變量,實(shí)際上它是給到 C++ 存數(shù)據(jù)的,所以我們?nèi)≈登耙残枰卺尫艃?nèi)存之前。它的類型是:Pointer<Uint8>,實(shí)際上也就這幾個(gè)方法和屬性:
Flutter Dart FFI Pointer<Uint8>類型如何轉(zhuǎn)成數(shù)組或String,Flutter,flutter,dart,C++
這個(gè)變量實(shí)際存的是 C++ 的 uint8_t *response,是一個(gè)指針數(shù)組(由n個(gè)指針類型元素組成的一個(gè)數(shù)組),而不是一個(gè)數(shù)組指針(數(shù)組變量是一個(gè)指針類型),上面列舉的錯(cuò)誤方式其實(shí)操作的是指針變量,而 elementAt 取到的才是指針數(shù)組里的單個(gè)元素的指針文章來源地址http://www.zghlxwxcb.cn/news/detail-758799.html

到了這里,關(guān)于Flutter Dart FFI Pointer<Uint8>類型如何轉(zhuǎn)成數(shù)組或String的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • javascript(js)語法 將blob轉(zhuǎn)arrayBuffer、arrayBuffer轉(zhuǎn)Uint8Array、Uint8Array轉(zhuǎn)String的方法

    1. blob轉(zhuǎn)arrayBuffer的函數(shù) 2. arrayBuffer轉(zhuǎn)Uint8Array的函數(shù) 3. Uint8Array轉(zhuǎn)String的函數(shù) 測試上面三種方法

    2024年02月06日
    瀏覽(19)
  • 【C語言】uint8_t、uint16_t、uint32_t、uint64_t是什么?

    【C語言】uint8_t、uint16_t、uint32_t、uint64_t是什么?

    uint8_t 是一個(gè) 數(shù)據(jù)類型 ,也是別名,它是 無符號(hào)8位整數(shù) 類型的縮寫。 uint 表示 無符號(hào)整數(shù) ,即數(shù)值 不能為負(fù)數(shù) ; 8 表示該類型的大小為 8位 ,即該類型可表示的 最大值255 , 最小值0 ; _t 表示別名,用typedef定義的數(shù)據(jù)類型。 在C++和C語言中,uint8_t 通常是通過標(biāo)準(zhǔn)頭文件

    2024年02月16日
    瀏覽(28)
  • 詳解C語言中的int8_t、uint8_t、int16_t、uint16_t、int32_t、uint32_t、int64_t、uint64_t

    詳解C語言中的int8_t、uint8_t、int16_t、uint16_t、int32_t、uint32_t、int64_t、uint64_t

    2023年8月8日,周二上午 目錄 為什么會(huì)產(chǎn)生int8_t、uint8_t等這類數(shù)據(jù)類型 int8_t、uint8_t等這類數(shù)據(jù)類型有什么用 頭文件 int8_t、uint8_t等這類數(shù)據(jù)類型是怎么實(shí)現(xiàn)的 根本原因在于,C 語言標(biāo)準(zhǔn)只是規(guī)定了各個(gè)基本類型的最小字節(jié)長度,但并沒有指定它們的確切字節(jié)長度: char 類型

    2024年02月13日
    瀏覽(26)
  • JS各種數(shù)據(jù)流之間的格式(ArrayBuffer、Uint8Array、Blob、 File、DataURL)相互轉(zhuǎn)換及應(yīng)用

    JS各種數(shù)據(jù)流之間的格式(ArrayBuffer、Uint8Array、Blob、 File、DataURL)相互轉(zhuǎn)換及應(yīng)用

    前端網(wǎng)頁?File?上傳、下載,Canvas?保存圖片,Ajax?和?Fetch?二進(jìn)制流傳輸,PDF?預(yù)覽,瀏覽器上?WebAssembly?的應(yīng)用?等等都需要到?ArrayBuffer?和?Blob?。 FileReader 對象允許Web應(yīng)用程序異步讀取存儲(chǔ)在用戶計(jì)算機(jī)上的文件(或原始數(shù)據(jù)緩沖區(qū))的內(nèi)容,使用 File 或 Blob 對象指定要

    2024年02月08日
    瀏覽(19)
  • Conda虛擬環(huán)境下libp11-kit.so.0: undefined symbol: ffi_type_pointer...問題解決

    Conda虛擬環(huán)境下libp11-kit.so.0: undefined symbol: ffi_type_pointer...問題解決

    最近需要在Conda虛擬環(huán)境下運(yùn)行ROS相關(guān)代碼,其中在運(yùn)行代碼 import moveit_commander 時(shí),返回報(bào)錯(cuò) ImportError: /lib/x86_64-linux-gnu/libp11-kit.so.0: undefined symbol: ffi_type_pointer, version LIBFFI_BASE_7.0 。由于在網(wǎng)上沒有找到和我一樣的問題,且在github上也沒找到解決方法,以為是個(gè)例就沒打算記

    2024年02月03日
    瀏覽(22)
  • 【Flutter】Dart/Flutter SDK如何降低版本、回退到指定版本

    【Flutter】Dart/Flutter SDK如何降低版本、回退到指定版本

    因?yàn)閐art3.0以后不再支持 no-sound-null-safety;但是有些項(xiàng)目不得以切換到dart3.0以前繼續(xù)使用運(yùn)行項(xiàng)目 方法1: 通過 命令,將flutter降級(jí)為當(dāng)前通道的上一個(gè)活動(dòng)版本; 如果沒有存在老版本則會(huì)提示 flutter downgrade There is no previously recorded version for channel “stable”. 這樣的話則可以通

    2024年02月16日
    瀏覽(22)
  • 【教程】Flutter與Rust完美交互,無需手寫FFI代碼

    【教程】Flutter與Rust完美交互,無需手寫FFI代碼

    實(shí)踐環(huán)境:Windows11 flutter_rust_bridge官方文檔 Flutter環(huán)境配置教程 | Rust環(huán)境配置教程 新建一個(gè)全新的Flutter項(xiàng)目并運(yùn)行: 在Flutter項(xiàng)目根目錄新建一個(gè)Rust項(xiàng)目: 目錄結(jié)構(gòu)大概是這樣的: 接下來,將這兩行添加到? Cargo.toml : ?在native/src目錄新建一個(gè)api.rs 添加以下示例代碼: ?

    2024年02月12日
    瀏覽(13)
  • 教程:Flutter 和 Rust混合編程,使用flutter_rust_bridge自動(dòng)生成ffi代碼

    教程:Flutter 和 Rust混合編程,使用flutter_rust_bridge自動(dòng)生成ffi代碼

    實(shí)踐環(huán)境:Arch Linux flutter_rust_bridge官方文檔 Flutter環(huán)境配置教程 | Rust環(huán)境配置教程 記錄使用 flutter_rust_bridge 遇到的一些坑。 假設(shè)我們已經(jīng)配置了Fluuter與Rust環(huán)境 現(xiàn)在直接使用flutter_rust_bridge模板創(chuàng)建自己的項(xiàng)目 運(yùn)行: 現(xiàn)在我們先讓項(xiàng)目跑起來: 編輯 native/src/api.rs 安裝代碼生

    2024年02月09日
    瀏覽(26)
  • 【Flutter 面試題】Dart是什么?Dart和Flutter有什么關(guān)系?

    【Flutter 面試題】Dart是什么?Dart和Flutter有什么關(guān)系?

    【Flutter 面試題】Dart是什么?Dart和Flutter有什么關(guān)系? ???? 正在學(xué) Flutter 的同學(xué),你好! ?? 本專欄是解決 Flutter 面試過程中可能出現(xiàn)的問題,而進(jìn)行匯總整理的。一個(gè)問題一篇文章,盡可能詳細(xì)解答,滿足面試需求。 ?? 想解決開發(fā)中的零散問題?碎片化教程 ?? Flutte

    2024年02月22日
    瀏覽(21)
  • C# int和uint類型學(xué)習(xí)

    C# int和uint類型學(xué)習(xí)

    在C#中,使用int表示整數(shù)類型,對應(yīng)于.NET的System.Int32結(jié)構(gòu); C#中的int類型占4字節(jié)(4*8=32位)內(nèi)存空間,其范圍從-2,147,483,648 到 2,147,483,647; int類型是默認(rèn)的整數(shù)類型,并且默認(rèn)值是0; uint類型也是整數(shù)類型,占4字節(jié)(32位)內(nèi)存空間,范圍是0-4294967295之間的正整數(shù),對應(yīng)于.NET的

    2024年02月12日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包