与dart中的struct.pack('〈I',int)等效的函数

6rvt4ljy  于 2023-03-10  发布在  其他
关注(0)|答案(2)|浏览(185)

Python和JavaScript中都有一个名为pack的函数
在JavaScript中:

struct.pack('<I', 5311)

在Python中

pack("<I", 5311)

将得到[0, 0, 20, 191]b'\x00\x00\x14\xbf'
dart中是否有等效函数?

k10s72fa

k10s72fa1#

int timestamp = 5311;
var sendValueBytes = ByteData(8);

try {
  sendValueBytes.setUint64(0, timestamp.toInt(), Endian.little);
} on UnsupportedError {
  sendValueBytes.setUint32(0, timestamp.toInt(), Endian.little);
}

Uint8List timeInBytes = sendValueBytes.buffer.asUint8List();
timeInBytes = timeInBytes.sublist(0, timeInBytes.length - 4);

String inHex = '';
timeInBytes.forEach((element) {
  inHex += element.toRadixString(16).padLeft(2, '0') + ' ';
});

print(inHex); // Will be: bf 14 00 00
print(timeInBytes); // Will be: [191, 20, 0, 0]

值得一提的是,dart中的int是8个字节,所以要得到4,我们需要手动删除它,就像我对.sublist所做的那样。
堆栈溢出中this question的功劳。

lhcgjxsq

lhcgjxsq2#

dart中实际上有一种打包或解包值的方法,但代码有点冗长。
它可以使用dart:typed_datadart:ffi库来实现。
1.创建结构

@Packed(1) // To account for padding
class MyStruct extends Struct {
  @LongLong() // See NativeType class for complete list of available types 
  external int timestamp;
}

1.为结构分配内存

const size = 8;
final pointer = calloc.allocate<Uint8>(size);
final struct = pointer.cast<MyStruct>();

1.赋值

struct.ref.timestamp = DateTime.now().millisecondsSinceEpoch;

1.获取字节列表

final bytes = pointer.asTypedList(size);
print('bytes $bytes');

相关问题