newLISP TCP通信的一些技巧

2023-11-27 01:58
文章标签 技巧 通信 tcp newlisp

本文主要是介绍newLISP TCP通信的一些技巧,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

如何发送字节数组

net-send仅仅接受string作为参数,也就是说只能发送字符串。

后来才发现,原来这只是这个API的接口,通过字符串仍然能够发送二进制数据,比如:

> (net-send socket "\019\000")
2
只需要前面加上\转义符号即可。


如何发送16位整数,并按照big-endian顺序发送

答案是pack。看下面的例子:

> (set 'socket (net-connect "localhost" 8889))
5
> (set 'size (pack ">u" 19))
"\000\019"
> (net-send socket size)
2

">u" 指定了这是一个unsigned short,而且是big-endian字节顺序,19将被转换成"\000\019"

注意,这里的低地址是从左开始的,也就是整数19的高字节0位于最低地址上,因此的确是big-endian.


如何在接收到的二进制数据中获取指定位置的字节

答案是address和+,下面有两个辅助函数:

(define (pick-byte buffer offset)(get-char (+ (address buffer) offset)))(define (pick-char buffer offset)(char (pick-byte buffer offset)))

看看怎么使用?

  (unless (net-receive socket message 13) (quit-for-error))(println (pick-byte message 0))(println (pick-char message 1))
先从TCP连接中读取13个字节,存放在message symbol中。然后用address获取message在内存中的其实地址,再用+获取第n个字节的内存地址,这时得到的字节,可以用char将其转换成ASCII字符。

如何在接收到的二进制数据中获取连续的字节
下面有两个函数,一个获取连续字节,一个获取连续字符串,前者返回list, 后者返回字符串

;; extract the bytes from buffer in [start, end) and return it as a list
(define (pick-bytes buffer start end)(let (l '())(dotimes (x (- end start))(push (pick-byte buffer (+ start x)) l -1))));; extract the string from buffer in [start, end) and return it as a string
(define (pick-string buffer start end)(let (l "")(dotimes (x (- end start))(push (pick-char buffer (+ start x)) l -1))))

我的程序中,取四个连续字符,这是一个16进制的字面常量,下面用int将其转换成整数

  (unless (net-receive socket message 13) (quit-for-error))(println (int (append "0x" (pick-string message 1 5))))
解析出来的是"000D", 加上0x后变成"0x000D" 用int函数转换后变成13.




这篇关于newLISP TCP通信的一些技巧的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/426756

相关文章

快速修复一个Panic的Linux内核的技巧

《快速修复一个Panic的Linux内核的技巧》Linux系统中运行了不当的mkinitcpio操作导致内核文件不能正常工作,重启的时候,内核启动中止于Panic状态,该怎么解决这个问题呢?下面我们就... 感谢China编程(www.chinasem.cn)网友 鸢一雨音 的投稿写这篇文章是有原因的。为了配置完

Python ZIP文件操作技巧详解

《PythonZIP文件操作技巧详解》在数据处理和系统开发中,ZIP文件操作是开发者必须掌握的核心技能,Python标准库提供的zipfile模块以简洁的API和跨平台特性,成为处理ZIP文件的首选... 目录一、ZIP文件操作基础三板斧1.1 创建压缩包1.2 解压操作1.3 文件遍历与信息获取二、进阶技

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

Java Optional的使用技巧与最佳实践

《JavaOptional的使用技巧与最佳实践》在Java中,Optional是用于优雅处理null的容器类,其核心目标是显式提醒开发者处理空值场景,避免NullPointerExce... 目录一、Optional 的核心用途二、使用技巧与最佳实践三、常见误区与反模式四、替代方案与扩展五、总结在 Java

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

电脑win32spl.dll文件丢失咋办? win32spl.dll丢失无法连接打印机修复技巧

《电脑win32spl.dll文件丢失咋办?win32spl.dll丢失无法连接打印机修复技巧》电脑突然提示win32spl.dll文件丢失,打印机死活连不上,今天就来给大家详细讲解一下这个问题的解... 不知道大家在使用电脑的时候是否遇到过关于win32spl.dll文件丢失的问题,win32spl.dl

电脑报错cxcore100.dll丢失怎么办? 多种免费修复缺失的cxcore100.dll文件的技巧

《电脑报错cxcore100.dll丢失怎么办?多种免费修复缺失的cxcore100.dll文件的技巧》你是否也遇到过“由于找不到cxcore100.dll,无法继续执行代码,重新安装程序可能会解... 当电脑报错“cxcore100.dll未找到”时,这通常意味着系统无法找到或加载这编程个必要的动态链接库

如何关闭 Mac 触发角功能或设置修饰键? mac电脑防止误触设置技巧

《如何关闭Mac触发角功能或设置修饰键?mac电脑防止误触设置技巧》从Windows换到iOS大半年来,触发角是我觉得值得吹爆的MacBook效率神器,成为一大说服理由,下面我们就来看看mac电... MAC 的「触发角」功能虽然提高了效率,但过于灵敏也让不少用户感到头疼。特别是在关键时刻,一不小心就可能触

前端bug调试的方法技巧及常见错误

《前端bug调试的方法技巧及常见错误》:本文主要介绍编程中常见的报错和Bug,以及调试的重要性,调试的基本流程是通过缩小范围来定位问题,并给出了推测法、删除代码法、console调试和debugg... 目录调试基本流程调试方法排查bug的两大技巧如何看控制台报错前端常见错误取值调用报错资源引入错误解析错误