如何处理非ASCII字节流,应对字节顺序变化问题?
- 内容介绍
- 文章标签
- 相关推荐
本文共计676个文字,预计阅读时间需要3分钟。
需要编码解码字节流(可能包含非ASCII字符),从/输入uint16、uint32、uint64(它们的常见C++含义)处理字节顺序。什么是有效希望跨平台的方案在Lua中实现这样的事件?
在Lua中实现跨平台的字节流编码解码,尤其是考虑到64位x86_64架构,以下是一个简洁的实现方案:
lua-- 定义一个简单的字节顺序转换函数function byteSwap(value, size) local swapped=0 for i=1, size do swapped=(swapped <<8) + (value % 256) value=math.floor(value / 256) end return swappedend
-- 编码函数,将数值转换为字节流function encode(value, size) local bytes=string.char() for i=1, size do bytes=bytes .. string.char(value % 256) value=math.floor(value / 256) end return bytesend
-- 解码函数,将字节流转换为数值function decode(bytes, size) local value=0 for i=1, size do value=(value <<8) + string.byte(bytes:sub(i, i)) end return valueend
-- 示例使用local uint16_value=byteSwap(0x1234, 2)local uint32_value=byteSwap(0x12345678, 4)local uint64_value=byteSwap(0x123456789ABCDEF0, 8)
local encoded_uint16=encode(uint16_value, 2)local encoded_uint32=encode(uint32_value, 4)local encoded_uint64=encode(uint64_value, 8)
local decoded_uint16=decode(encoded_uint16, 2)local decoded_uint32=decode(encoded_uint32, 4)local decoded_uint64=decode(encoded_uint64, 8)
print(Original uint16:, uint16_value, Encoded:, encoded_uint16, Decoded:, decoded_uint16)print(Original uint32:, uint32_value, Encoded:, encoded_uint32, Decoded:, decoded_uint32)print(Original uint64:, uint64_value, Encoded:, encoded_uint64, Decoded:, decoded_uint64)
这个方案在Lua中实现了基本的字节顺序转换和编码解码功能。由于Lua是动态类型的脚本语言,它本身并不直接支持64位整数,所以这里使用了字符串操作来处理字节流。这种方法在64位x86_64架构上是有效的,因为它依赖于底层系统的字节顺序处理。
对于跨平台的需求,Lua提供了良好的跨平台支持,但需要注意的是,不同平台上的字节顺序(endianess)可能不同。上面的代码假设系统使用的是大端字节序(big-endian),如果目标平台使用小端字节序(little-endian),则需要相应地调整`byteSwap`函数。
需要编码&解码字节流(可能包含非ascii字符),从/进入uint16,uint32,uint64(它们的典型C/C++含义),处理字节顺序.什么是有效的&希望跨平台的方式在Lua做这样的事情?我的目标arch是64位x86_64,但是想保持它的可移植性(如果它在性能方面没有花费我的成本).
例如
解码(比如当前在Lua字符串中) –
0x00,0x1d,0xff,0x23,0x44,0x32(小端)
作为 –
uint16:(0x1d00)= 7424
uint32:(0x324423ff)= 843326463
如果有人可以用一个例子解释,那将会很棒.
看一下 struct和 lpack图书馆.在这个例子中,我使用struct.unpack将Lua字符串解码为带有强制little-endian编码的两个整数:
require 'struct' -- convert character codes to a Lua string - this may come from your source local str = string.char(0x00, 0x1d, 0xff, 0x23, 0x44, 0x32) -- format string: < = little endian, In = unsigned int (n bytes) local u16, u32 = struct.unpack('<I2I4', str) print(u16, u32) --> 7424 843326463
本文共计676个文字,预计阅读时间需要3分钟。
需要编码解码字节流(可能包含非ASCII字符),从/输入uint16、uint32、uint64(它们的常见C++含义)处理字节顺序。什么是有效希望跨平台的方案在Lua中实现这样的事件?
在Lua中实现跨平台的字节流编码解码,尤其是考虑到64位x86_64架构,以下是一个简洁的实现方案:
lua-- 定义一个简单的字节顺序转换函数function byteSwap(value, size) local swapped=0 for i=1, size do swapped=(swapped <<8) + (value % 256) value=math.floor(value / 256) end return swappedend
-- 编码函数,将数值转换为字节流function encode(value, size) local bytes=string.char() for i=1, size do bytes=bytes .. string.char(value % 256) value=math.floor(value / 256) end return bytesend
-- 解码函数,将字节流转换为数值function decode(bytes, size) local value=0 for i=1, size do value=(value <<8) + string.byte(bytes:sub(i, i)) end return valueend
-- 示例使用local uint16_value=byteSwap(0x1234, 2)local uint32_value=byteSwap(0x12345678, 4)local uint64_value=byteSwap(0x123456789ABCDEF0, 8)
local encoded_uint16=encode(uint16_value, 2)local encoded_uint32=encode(uint32_value, 4)local encoded_uint64=encode(uint64_value, 8)
local decoded_uint16=decode(encoded_uint16, 2)local decoded_uint32=decode(encoded_uint32, 4)local decoded_uint64=decode(encoded_uint64, 8)
print(Original uint16:, uint16_value, Encoded:, encoded_uint16, Decoded:, decoded_uint16)print(Original uint32:, uint32_value, Encoded:, encoded_uint32, Decoded:, decoded_uint32)print(Original uint64:, uint64_value, Encoded:, encoded_uint64, Decoded:, decoded_uint64)
这个方案在Lua中实现了基本的字节顺序转换和编码解码功能。由于Lua是动态类型的脚本语言,它本身并不直接支持64位整数,所以这里使用了字符串操作来处理字节流。这种方法在64位x86_64架构上是有效的,因为它依赖于底层系统的字节顺序处理。
对于跨平台的需求,Lua提供了良好的跨平台支持,但需要注意的是,不同平台上的字节顺序(endianess)可能不同。上面的代码假设系统使用的是大端字节序(big-endian),如果目标平台使用小端字节序(little-endian),则需要相应地调整`byteSwap`函数。
需要编码&解码字节流(可能包含非ascii字符),从/进入uint16,uint32,uint64(它们的典型C/C++含义),处理字节顺序.什么是有效的&希望跨平台的方式在Lua做这样的事情?我的目标arch是64位x86_64,但是想保持它的可移植性(如果它在性能方面没有花费我的成本).
例如
解码(比如当前在Lua字符串中) –
0x00,0x1d,0xff,0x23,0x44,0x32(小端)
作为 –
uint16:(0x1d00)= 7424
uint32:(0x324423ff)= 843326463
如果有人可以用一个例子解释,那将会很棒.
看一下 struct和 lpack图书馆.在这个例子中,我使用struct.unpack将Lua字符串解码为带有强制little-endian编码的两个整数:
require 'struct' -- convert character codes to a Lua string - this may come from your source local str = string.char(0x00, 0x1d, 0xff, 0x23, 0x44, 0x32) -- format string: < = little endian, In = unsigned int (n bytes) local u16, u32 = struct.unpack('<I2I4', str) print(u16, u32) --> 7424 843326463

