如何将整数转换为字节数组并再次转换回来?
我需要通过NetworkStream发送一个整数,但问题是我只能发送字节。 这就是为什么我需要分割整数,将其分成四个字节发送,然后在另一端将其转换回int。
目前,我只需要在C#中实现。但对于最终项目,我需要将四个字节转换为Lua中的int。
[编辑] Lua中怎么办?
原文链接 https://stackoverflow.com/questions/3099275
调查 BinaryWriter/BinaryReader 类
将一个整数转换成一个字节数组并显示:BitConverter...
www.java2s.com/Tutorial/CSharp/0280\_\_Development/Convertaninttoabytearrayanddisplay.htm
整数转换成字节 - Visual Basic .NET 答案
http://bytes.com/topic/visual-basic-net/answers/349731-integer-byte
如何:将字节数组转换为整数(C# 编程指南)
正如Nubsis所说,BitConverter
是适当的但没有保证字节顺序。
我在MiscUtil中有一个EndianBitConverter
类,它允许您指定字节顺序。当然,如果您只想针对单个数据类型(int
)执行此操作,您可以手动编写代码。
BinaryWriter
是另一个选项,并且_确保_使用小端字节顺序。 (同样,如果您想要其他选项,MiscUtil有一个EndianBinaryWriter
。)
BitConverter
是最简单的方法,但如果你想控制字节的顺序,你可以自己进行位移操作。
int foo = int.MaxValue;
byte lolo = (byte)(foo & 0xff);
byte hilo = (byte)((foo >> 8) & 0xff);
byte lohi = (byte)((foo >> 16) & 0xff);
byte hihi = (byte)(foo >> 24);
此外,BitConverter
的实现使用了 unsafe
和指针,但它很短且简单。
public static unsafe byte[] GetBytes(int value)
{
byte[] buffer = new byte[4];
fixed (byte* numRef = buffer)
{
*((int*) numRef) = value;
}
return buffer;
}
将其转换为byte[]:
BitConverter.GetBytes(int)
http://msdn.microsoft.com/en-us/library/system.bitconverter.aspx
将其转换回int:
BitConverter.ToInt32(byteArray,offset)
http://msdn.microsoft.com/en-us/library/system.bitconverter.toint32.aspx
我不确定Lua。
如果你关注字节序,可以使用John Skeet的EndianBitConverter。我用过它,它可以无缝地工作。
C#支持自己实现htons和ntohs:
但它们仅适用于signed int16、int32、int64,这意味着您可能会执行大量不必要的类型转换才能使它们正常工作,如果您将最高位用于除签署整数之外的任何其他内容,则将被破坏。曾经遇到过这种情况。::tsk:: ::tsk::微软未在.NET中提供更好的字节序转换支持。
下面是在 Lua 中将一个 32 位二进制补码数转换为字节以及将四个字节转换为 32 位二进制补码数的一些函数。应该做更多的检查以验证传入的参数是否有效。
-- 将 32 位二进制补码整数转换为四个字节(网络顺序)
function int_to_bytes(n)
if n > 2147483647 then error(n.." 太大了",2) end
if n < -2147483648 then error(n.." 太小了",2) end
-- 调整为 2 的补码
n = (n < 0) and (4294967296 + n) or n
return (math.modf(n/16777216))%256, (math.modf(n/65536))%256, (math.modf(n/256))%256, n%256
end
-- 将字节(网络顺序)转换为 32 位二进制补码整数
function bytes_to_int(b1, b2, b3, b4)
if not b4 then error("需要四个字节才能转换为整数",2) end
local n = b1*16777216 + b2*65536 + b3*256 + b4
n = (n > 2147483647) and (n - 4294967296) or n
return n
end
print(int_to_bytes(256)) --> 0 0 1 0
print(int_to_bytes(-10)) --> 255 255 255 246
print(bytes_to_int(255,255,255,246)) --> -10
对于Lua,可以查看Roberto的struct库。(Roberto是Lua的作者之一。)它比实际需要的更通用,但是很可能在需要交换int
之后不久就需要交换其他简单类型或更大的结构体。
假设本地字节顺序在两端都是可接受的(顺便说一下,这很可能是一个糟糕的假设),那么可以使用以下代码将数字转换为4字节整数:
buffer = struct.pack("l", value)
通过以下代码将其转换回来:
value = struct.unpack("l", buffer)
在两种情况下,buffer
是包含字节的Lua字符串。如果需要从Lua访问单个字节值,string.byte
将是您的好朋友。
要指定打包数据的字节顺序,请将格式从"l"
更改为"<l"
(小端)或">l"
(大端)。
该struct
模块是用C实现的,必须在平台上编译为DLL或等效项后才能被Lua使用。话虽如此,它包含在Lua for Windows预装程序包中,这是在Windows系统上安装Lua的常用方式。
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
尝试
BitConverter.GetBytes()
http://msdn.microsoft.com/en-us/library/system.bitconverter.aspx
请记住,返回的数组中字节的顺序取决于您的系统的字节序。
编辑: 至于 Lua 部分,我不知道如何进行转换。您可以通过乘以 16 来获得按 4 位进行位移的相同功能。这不是很好看,我想应该有一些库或类可以实现它。同样,添加字节的顺序取决于字节序,所以您可能需要对此进行一些学习。
也许您可以在 C# 中进行转换?